# By: Riasat Ullah
# This file contains all view that are related to subscriptions.

from dbqueries import db_organizations, db_users
from exceptions.user_exceptions import InvalidRequest
from notices import account_notices
from rest_framework.decorators import api_view
from rest_framework.response import Response
from translators import label_translator as _lt
from utils.db_connection import CONN_POOL
from utils import errors, info, logging, mail, times, tokenizer, var_names
from validations import request_validator, string_validator


@api_view(['POST'])
def email_non_user_contact(request):
    '''
    Emails the person who contacted from TaskCall's info site.
    :param request: Http request
    :return: Http response -> dict of details
    '''
    if request.method == 'POST':
        lang = request_validator.get_user_language(request)
        expected_fields = [var_names.display_name, var_names.email, var_names.email_subject, var_names.email_body]
        try:
            request_validator.validate_fields(request, expected_fields)

            email_addr = request.data[var_names.email]
            assert string_validator.is_email_address(email_addr)

            subject, body = account_notices.non_user_contact_form_email_content(
                lang, email_addr, request.data[var_names.display_name], request.data[var_names.email_subject],
                request.data[var_names.email_body]
            )
            mail.AmazonSesDispatcher(subject, body, [email_addr, 'support@taskcallapp.freshdesk.com'],
                                     with_logo=True).start()
            return Response(_lt.get_label(info.msg_ticket_created, lang))
        except InvalidRequest as e:
            logging.exception(str(e))
            return Response(_lt.get_label(errors.err_authorization, lang), status=400)
        except Exception as e:
            logging.exception(str(e))
            return Response(_lt.get_label(errors.err_system_error, lang), status=500)


@api_view(['POST'])
def create_ticket(request, conn=None):
    '''
    Creates a support ticket.
    :param request: Http request
    :param conn: db connection
    :return: Http response -> dict of details
    '''
    if request.method == 'POST':
        lang = request_validator.get_user_language(request)
        expected_fields = [var_names.email_subject, var_names.email_body]
        try:
            conn = CONN_POOL.get_db_conn() if conn is None else conn
            request_validator.validate_fields(request, expected_fields)
            user_id, org_id, user_perm, org_perm = tokenizer.authorize_request(request)

            current_time = times.get_current_timestamp()
            user_details = db_users.get_user_details(conn, current_time, org_id, user_id=user_id)
            email_addr = user_details[var_names.email]
            first_name = user_details[var_names.first_name]

            support_emails = [email_addr, 'support@taskcallapp.freshdesk.com']
            sales_channel = db_organizations.get_organization_sales_channel_details(conn, current_time, org_id)
            if len(sales_channel) > 0 and sales_channel[var_names.email] is not None:
                support_emails.append(sales_channel[var_names.email])

            subject, body = account_notices.non_user_contact_form_email_content(
                lang, email_addr, first_name, request.data[var_names.email_subject],
                request.data[var_names.email_body]
            )
            mail.AmazonSesDispatcher(subject, body, support_emails, with_logo=True).start()
            return Response(_lt.get_label(info.msg_ticket_created, lang))
        except InvalidRequest as e:
            logging.exception(str(e))
            return Response(_lt.get_label(errors.err_authorization, lang), status=400)
        except Exception as e:
            logging.exception(str(e))
            return Response(_lt.get_label(errors.err_system_error, lang), status=500)
