# By: Riasat Ullah
# This file contains variables specifically for Freshdesk.

from constants import api_paths, var_names
from requests.auth import HTTPBasicAuth
from utils import helpers
import requests


# url paths
freshdesk_field_types_path_format = 'https://{0}/api/v2/admin/ticket_fields'
freshdesk_ticket_path_format = 'https://{0}/a/tickets/{1}'

# internal variables for Freshdesk
str_undefined = 'undefined'

# Freshdesk variables
str_freshdesk_access_token = 'freshdesk_access_token'
str_freshdesk_display_name = 'freshdesk_display_name'
str_freshdesk_origin = 'freshdesk_origin'
str_freshdesk_refresh_token = 'freshdesk_refresh_token'
str_freshdesk_ticket_id = 'freshdesk_ticket_id'

# Freshdesk ticket types
incident_ticket_type = 'incident'
problem_ticket_type = 'problem'
question_ticket_type = 'question'
task_ticket_type = 'task'

# TaskCall allowed url calls
cmd_acknowledge = 'acknowledge'
cmd_add_responders = 'add-responders'
cmd_create_incident = 'create-incident'
cmd_link = 'link'
cmd_linked_incidents = 'linked-incidents'
cmd_list_policies = 'list-policies'
cmd_list_response_sets = 'list-response-sets'
cmd_list_services = 'list-services'
cmd_notate = 'notate'
cmd_reassign = 'reassign'
cmd_resolve = 'resolve'
cmd_run_response_set = 'run-response-set'
cmd_status_dashboard = 'status-dashboard'
cmd_subscribe = 'subscribe'
cmd_unacknowledge = 'unacknowledge'
cmd_unlink = 'unlink'
cmd_unsubscribe = 'unsubscribe'
cmd_update_status = 'update-status'
cmd_view_incidents = 'view-incidents'

# error messages
err_unknown_action = 'The requested action was either not found or is not allowed'


freshdesk_allowed_actions = [cmd_acknowledge, cmd_add_responders, cmd_status_dashboard, cmd_link,
                             cmd_linked_incidents, cmd_list_policies, cmd_list_response_sets, cmd_list_services,
                             cmd_notate, cmd_reassign, cmd_resolve, cmd_run_response_set, cmd_subscribe,
                             cmd_unacknowledge, cmd_unlink, cmd_unsubscribe, cmd_update_status, cmd_view_incidents]


def get_token_details_for_freshdesk(request):
    '''
    Get the details of a TaskCall issued token for Freshdesk.
    :param request: Http request
    :return: JSON response -> (tuple --> access_token, expiry, display name)
    '''
    access_token, token_expiry, display_name = None, None, None
    if str_freshdesk_access_token in request.COOKIES:
        access_token = request.COOKIES.get(str_freshdesk_access_token)
    elif str_freshdesk_refresh_token in request.COOKIES:
        refresh_token = request.COOKIES.get(str_freshdesk_refresh_token)
        body = {var_names.refresh_token: refresh_token}

        status, output = helpers.send_post_request(api_paths.integrations_freshdesk_token_refresh, body)
        if status == 200:
            access_token = output[var_names.access_token]
            token_expiry = output[var_names.expires_on]

    if str_freshdesk_display_name in request.COOKIES:
        display_name = request.COOKIES.get(str_freshdesk_display_name)

    return access_token, token_expiry, display_name


def get_freshdesk_ticket_types(domain, api_key):
    '''
    Get Freshdesk ticket types from the client's Freshdesk account.
    :param domain: Freshdesk domain
    :param api_key: Freshdesk api key
    '''
    sts_code, sts_output = 200, []
    resp_fields = requests.get(freshdesk_field_types_path_format.format(domain), auth=HTTPBasicAuth(api_key, 'x'))
    fields_sts, fields_out = resp_fields.status_code, resp_fields.json()
    if fields_sts in (200, 201):
        ticket_type_field_id = None
        for field in fields_out:
            if field['name'] == 'ticket_type':
                ticket_type_field_id = field['id']
                break

        if ticket_type_field_id is not None:
            url_tick_type = freshdesk_field_types_path_format.format(domain) + '/' + str(ticket_type_field_id)
            resp_tt = requests.get(url_tick_type, auth=HTTPBasicAuth(api_key, 'x'))
            tt_sts, tt_out = resp_tt.status_code, resp_tt.json()
            if tt_sts in (200, 201):
                sts_output = sorted([[x['label'], x['value']] for x in tt_out['choices']])
            else:
                sts_code = tt_sts
    else:
        sts_code = fields_sts

    return sts_code, sts_output
