# By: Riasat Ullah
# This file contains all AppBeat service integration related views.

from data_syncers import syncer_services
from exceptions.user_exceptions import InvalidRequest
from integrations import appbeat
from modules.router import Router
from objects.task_payload import TaskPayload
from rest_framework.decorators import api_view
from rest_framework.response import Response
from translators import label_translator as _lt
from utils import constants, errors, info, key_manager, logging, times
from utils.db_connection import CACHE_CLIENT, CONN_POOL
from validations import request_validator
import configuration


@api_view(['POST'])
def process_incoming_webhook(request, integration_key, conn=None, cache=None):
    '''
    Processes the incoming webhook from AppBeat.
    :param request: Http request
    :param integration_key: integration key passed in the url
    :param conn: db connection
    :param cache: cache client
    :return: Http response
    '''
    if request.method == 'POST':
        lang = request_validator.get_user_language(request)
        try:
            conn = CONN_POOL.get_db_conn() if conn is None else conn
            cache = CACHE_CLIENT if cache is None else cache

            unmasked_integ_key = key_manager.unmask_reference_key(integration_key)

            ab_subject = request.data[appbeat.var_subject]
            ab_long_message = request.data[appbeat.var_long_message]
            ab_details = request.data[appbeat.var_details]

            tc_ab_text_body = ab_long_message + '  ' + '\n\n' + ab_details

            current_time = times.get_current_timestamp()
            integ_id, serv_id, org_id = syncer_services.get_integration_key_details(
                conn, cache, current_time, unmasked_integ_key)

            payload = TaskPayload(
                current_time, org_id, current_time.date(), ab_subject, configuration.standard_timezone,
                current_time.time(), text_msg=tc_ab_text_body, urgency_level=constants.critical_urgency,
                trigger_method=constants.integrations_api, trigger_info=request.data, integration_id=integ_id,
                integration_key=integration_key, service_id=serv_id
            )
            Router(conn, cache, payload).start()
            return Response(info.msg_internal_success)
        except InvalidRequest as e:
            logging.exception(str(e))
            return Response(_lt.get_label(errors.err_invalid_request, lang), status=400)
        except Exception as e:
            logging.exception(str(e))
            return Response(_lt.get_label(errors.err_system_error, lang), status=500)
        finally:
            CONN_POOL.put_db_conn(conn)
