# By: Riasat Ullah
# This file contains status page subscriber views.

from constants import api_paths, component_names as cnm, label_names as lnm, pages, static_vars, var_names
from context_manager import itsm_context
from django.core import exceptions
from django.http import JsonResponse
from django.shortcuts import redirect, render
from django.views.decorators.http import require_http_methods
from taskcallweb import settings
from system_tests.test_data import test_data_status_dashboard
from translators import label_translator as lt
from utils import helpers, logging
from validations import request_validator
import filetype
import json
import pandas


@require_http_methods(['GET', 'POST'])
def status_page_subscribers(request, page_ref_id):
    '''
    GET: Returns the status page incidents page.
    POST: Gets the status page incidents
    :param request: Http request
    :param page_ref_id: reference ID of the status page
    :return: JSON response
    '''
    if request.method == 'GET':
        if request_validator.user_in_session(request):
            lang = request_validator.get_user_language(request)
            nav_bar_components = request_validator.get_nav_bar_components(request)

            has_view_perm, has_edit_perm = request_validator.get_session_permission(
                request, cnm.dis_com_status_pages, nav_bar_components
            )
            if not has_view_perm or (page_ref_id is None and not has_edit_perm):
                raise exceptions.PermissionDenied

            context = itsm_context.get_status_pages_subscribers_context(lang, nav_bar_components)
            context[var_names.context] = json.dumps({var_names.page_ref_id: page_ref_id})
            context[var_names.has_edit_permission] = has_edit_perm

            return render(request, pages.status_pages_subscribers_page, context=context)
        else:
            helpers.set_session_redirect_page(request)
            return redirect(pages.login_url)
    elif request.method == 'POST':
        lang = request_validator.get_user_language(request)
        if request_validator.user_in_session(request):
            body = json.loads(request.body.decode())
            if settings.TEST_MODE:
                sub_list = test_data_status_dashboard.status_page_subscribers[page_ref_id]
                if var_names.subscription_type in body:
                    sub_list = [x for x in test_data_status_dashboard.status_page_subscribers[page_ref_id]
                                if x[var_names.subscription_type] == body[var_names.subscription_type]]
                return JsonResponse(sub_list, safe=False)
            else:
                status, output = helpers.post_api_request(api_paths.status_pages_subscribers_list,
                                                          body, request, lang=lang)
                return JsonResponse(output, status=status, safe=False)
        else:
            return JsonResponse(lt.get_label(lnm.err_unauthorized_access, lang), status=401, safe=False)


@require_http_methods(['POST'])
def add_status_page_subscriber(request, page_ref_id):
    '''
    Add subscriber(s) to the page.
    :param request: Http request
    :param page_ref_id: reference ID of the status page
    :return: JSON response
    '''
    if request.method == 'POST':
        lang = request_validator.get_user_language(request)
        if request_validator.user_in_session(request):
            body = json.loads(request.body.decode())
            if settings.TEST_MODE:
                return JsonResponse('Success', safe=False)
            else:
                status, output = helpers.post_api_request(api_paths.status_pages_subscribers_add,
                                                          body, request, lang=lang)
                return JsonResponse(output, status=status, safe=False)
        else:
            return JsonResponse(lt.get_label(lnm.err_unauthorized_access, lang), status=401, safe=False)


@require_http_methods(['POST'])
def delete_status_page_subscriber(request, page_ref_id):
    '''
    Delete status page subscriber(s).
    :param request: Http request
    :param page_ref_id: reference ID of the status page
    :return: JSON response
    '''
    if request.method == 'POST':
        lang = request_validator.get_user_language(request)
        if request_validator.user_in_session(request):
            body = json.loads(request.body.decode())
            if settings.TEST_MODE:
                return JsonResponse('Success', safe=False)
            else:
                status, output = helpers.post_api_request(api_paths.status_pages_subscribers_delete,
                                                          body, request, lang=lang)
                return JsonResponse(output, status=status, safe=False)
        else:
            return JsonResponse(lt.get_label(lnm.err_unauthorized_access, lang), status=401, safe=False)


@require_http_methods(['POST'])
def resend_subscriber_confirmation_request(request, page_ref_id):
    '''
    Resend the subscriber confirmation request.
    :param request: Http request
    :param page_ref_id: reference ID of the status page
    :return: JSON response
    '''
    if request.method == 'POST':
        lang = request_validator.get_user_language(request)
        if request_validator.user_in_session(request):
            body = json.loads(request.body.decode())
            if settings.TEST_MODE:
                return JsonResponse('Success', safe=False)
            else:
                status, output = helpers.post_api_request(api_paths.status_pages_subscribers_request_confirmation,
                                                          body, request, lang=lang)
                return JsonResponse(output, status=status, safe=False)
        else:
            return JsonResponse(lt.get_label(lnm.err_unauthorized_access, lang), status=401, safe=False)


@require_http_methods(['POST'])
def parse_subscriber_file(request, page_ref_id):
    '''
    Parse a csv file with subscribers' information.
    :param request: Http request
    :param page_ref_id: reference ID of the status page
    :return: JSON response
    '''
    if request.method == 'POST':
        lang = request_validator.get_user_language(request)
        if request_validator.user_in_session(request):

            all_files = request.FILES.getlist('files[]')
            logging.info(all_files)
            file = all_files[0]
            file_meta = filetype.guess(file)
            if file_meta is not None and file_meta.extension != 'csv' and file_meta.mime != 'text/csv':
                return JsonResponse(lt.get_label(lnm.err_status_page_subscriber_file, lang), status=422, safe=False)

            subscribers = []
            pd = pandas.read_csv(file)
            for index, row in pd.iterrows():
                sub_type = row[var_names.subscription_type]
                sub_value = row[var_names.subscriber]
                sub_bus = None if row[var_names.services] == 'ALL'\
                    else [x.strip() for x in row[var_names.services].split()]

                if sub_type == static_vars.email:
                    subscribers.append({
                        var_names.subscription_type: sub_type,
                        var_names.email: sub_value,
                        var_names.business_services: sub_bus
                    })
                elif sub_type == static_vars.webhook:
                    subscribers.append({
                        var_names.subscription_type: sub_type,
                        var_names.url: sub_value,
                        var_names.business_services: sub_bus
                    })
                else:
                    return JsonResponse(lt.get_label(lnm.err_status_page_subscriber_file, lang), status=401, safe=False)

            logging.info(subscribers)
            if len(subscribers) > 0:
                return JsonResponse(subscribers, safe=False)
            else:
                return JsonResponse(lt.get_label(lnm.err_status_page_subscriber_file, lang), status=401, safe=False)
        else:
            return JsonResponse(lt.get_label(lnm.err_unauthorized_access, lang), status=401, safe=False)
