# By: Riasat Ullah
# This file contains views for external status pages.

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
from validations import request_validator
import json


@require_http_methods(['POST'])
def status_page_templates_basic_list(request, page_ref_id):
    '''
    Get the basic list of the templates of a status 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 = {var_names.page_ref_id: page_ref_id}
            if settings.TEST_MODE:
                if page_ref_id in test_data_status_dashboard.status_page_templates:
                    basic_list = [[x[var_names.template_name], x[var_names.template_ref_id]]
                                  for x in test_data_status_dashboard.status_page_templates[page_ref_id]]
                    return JsonResponse(basic_list, safe=False)
                else:
                    return JsonResponse(lt.get_label(lnm.err_unknown_resource, lang), status=404, safe=False)
            else:
                status, output = helpers.post_api_request(api_paths.status_pages_templates_basic_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(['GET', 'POST'])
def status_page_templates(request, page_ref_id):
    '''
    GET: Returns the status page templates page.
    POST: Gets the status page templates.
    :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_templates_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_templates_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 = {var_names.page_ref_id: page_ref_id}
            if settings.TEST_MODE:
                if page_ref_id in test_data_status_dashboard.status_page_templates:
                    return JsonResponse(test_data_status_dashboard.status_page_templates[page_ref_id], safe=False)
                else:
                    return JsonResponse([], safe=False)
            else:
                status, output = helpers.post_api_request(api_paths.status_pages_templates_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(['GET', 'POST'])
def status_page_template_details(request, page_ref_id, template_ref_id=None):
    '''
    GET: Returns the status page template details page.
    POST: Gets the details of a status page.
    :param request: Http request
    :param page_ref_id: reference ID of the status page
    :param template_ref_id: reference ID of the template
    :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_template_details_context(lang, nav_bar_components)
            info_context = {var_names.page_ref_id: page_ref_id}
            if template_ref_id is not None:
                info_context[var_names.template_ref_id] = template_ref_id
            context[var_names.context] = json.dumps(info_context)
            context[var_names.has_edit_permission] = has_edit_perm

            return render(request, pages.status_pages_template_details_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 = {var_names.page_ref_id: page_ref_id,
                    var_names.template_ref_id: template_ref_id}
            if settings.TEST_MODE:
                if page_ref_id in test_data_status_dashboard.status_page_templates:
                    for item in test_data_status_dashboard.status_page_templates[page_ref_id]:
                        if item[var_names.template_ref_id] == template_ref_id:
                            return JsonResponse(item, safe=False)

                    return JsonResponse(lt.get_label(lnm.err_unknown_resource, lang), status=404, safe=False)
                else:
                    return JsonResponse(lt.get_label(lnm.err_unknown_resource, lang), status=404, safe=False)
            else:
                status, output = helpers.post_api_request(api_paths.status_pages_templates_details,
                                                          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 create_status_page_template(request, page_ref_id):
    '''
    Create a status page template.
    :param request: Http request
    :param page_ref_id: reference ID of the status page the template belongs to
    :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 page_ref_id != body[var_names.page_ref_id]:
                return JsonResponse(lt.get_label(lnm.err_unauthorized_access, lang), status=401, safe=False)

            if settings.TEST_MODE:
                status, output = 200, lt.get_label(lnm.msg_template_created, lang)
            else:
                status, output = helpers.post_api_request(api_paths.status_pages_templates_create,
                                                          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 edit_status_page_template(request, page_ref_id):
    '''
    Edit a status page template.
    :param request: Http request
    :param page_ref_id: reference ID of the status page the template belongs to
    :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 page_ref_id != body[var_names.page_ref_id]:
                return JsonResponse(lt.get_label(lnm.err_unauthorized_access, lang), status=401, safe=False)

            if settings.TEST_MODE:
                status, output = 200, lt.get_label(lnm.msg_template_created, lang)
            else:
                status, output = helpers.post_api_request(api_paths.status_pages_templates_edit,
                                                          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_template(request, page_ref_id):
    '''
    Deletes a status page template.
    :param request: Http request
    :param page_ref_id: reference ID of the status page the template belongs to
    :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 page_ref_id != body[var_names.page_ref_id]:
                return JsonResponse(lt.get_label(lnm.err_unauthorized_access, lang), status=401, safe=False)

            if settings.TEST_MODE:
                status, output = 200, lt.get_label(lnm.msg_template_deleted, lang)
            else:
                status, output = helpers.post_api_request(api_paths.status_pages_templates_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)
