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

from constants import api_paths, label_names as lnm, pages, static_vars, var_names
from constants import component_names as cnm
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(['GET', 'POST'])
def get_status_dashboard(request, url_extension=None):
    '''
    GET: Gets the status dashboard page.
    POST: Gets the details to display on the status dashboard.
    :param request: Http request
    :param url_extension: the url extension of the dashboard
    :return: GET: html page  |  POST: details of the status dashboard
    '''
    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_dashboard, nav_bar_components
            )
            if not has_view_perm:
                raise exceptions.PermissionDenied

            context = itsm_context.get_status_dashboard_context(lang, nav_bar_components)
            context[var_names.context] = json.dumps({var_names.dashboard_url: url_extension})
            context[var_names.is_custom] = True if url_extension is not None else False
            context[var_names.has_edit_permission] = has_edit_perm

            if settings.TEST_MODE:
                context[var_names.taskcall_domain] = static_vars.regional_test_server_urls[settings.REGION][
                    var_names.domain]
            else:
                context[var_names.taskcall_domain] = static_vars.regional_urls[settings.REGION][var_names.domain]

            return render(request, pages.status_dashboard_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):
            if settings.TEST_MODE:
                if url_extension is None:
                    return JsonResponse(test_data_status_dashboard.dashboard_details[None], safe=False)
                else:
                    if url_extension in test_data_status_dashboard.dashboard_details:
                        return JsonResponse(test_data_status_dashboard.dashboard_details[url_extension], safe=False)
                    else:
                        return JsonResponse(lt.get_label(lnm.err_unknown_resource, lang), status=404, safe=False)
            else:
                body = dict()
                if url_extension is not None:
                    body[var_names.dashboard_url] = url_extension

                status, output = helpers.post_api_request(api_paths.status_dashboard, 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_custom_status_dashboard(request):
    '''
    Creates a new business service.
    :param request: Http request
    :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('New status dashboard has been created', status=200, safe=False)
            else:
                status, output = helpers.post_api_request(api_paths.status_dashboard_custom_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_custom_status_dashboard(request):
    '''
    Edits a business service.
    :param request: Http request
    :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('Status dashboard has been edited', status=200, safe=False)
            else:
                status, output = helpers.post_api_request(api_paths.status_dashboard_custom_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_custom_status_dashboard(request):
    '''
    Deletes a business service.
    :param request: Http request
    :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('Status dashboard has been deleted', status=200, safe=False)
            else:
                status, output = helpers.post_api_request(api_paths.status_dashboard_custom_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)
