# By: Riasat Ullah
# This file contains code for serving non-integration configuration pages and data.

from constants import api_paths, component_names as cnm, label_names as lnm, pages, var_names
from context_manager import configurations_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_api_access
from translators import label_translator as lt
from utils import helpers
from validations import request_validator
import json
import random
import string


@require_http_methods(['GET', 'POST'])
def get_api_access_keys(request):
    '''
    GET: Gets the api access html page.
    POST: Gets details of all the api keys of the user's organization.
    :param request: Http request
    :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_api_access, nav_bar_components
            )
            if not has_view_perm:
                raise exceptions.PermissionDenied

            context = configurations_context.get_api_access_context(lang, nav_bar_components)
            return render(request, pages.api_access_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:
                return JsonResponse(test_data_api_access.global_api_keys, safe=False)
            else:
                body = dict()
                status, output = helpers.post_api_request(api_paths.global_api_keys, body, request)
                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_api_key(request):
    '''
    Creates a new API key.
    :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:
                new_key = ''.join(random.choice(string.ascii_uppercase +
                                                string.ascii_lowercase +
                                                string.digits) for _ in range(67))
                return JsonResponse(new_key, safe=False)
            else:
                status, output = helpers.post_api_request(api_paths.create_api_key, body, request)
                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_api_key(request):
    '''
    Edits an existing API key.
    :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('API key has been edited', safe=False)
            else:
                status, output = helpers.post_api_request(api_paths.edit_api_key, body, request)
                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_api_key(request):
    '''
    Deletes an existing API key.
    :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('API key has been deleted', safe=False)
            else:
                status, output = helpers.post_api_request(api_paths.delete_api_key, body, request)
                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 enable_api_key(request):
    '''
    Enables an API key.
    :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())
            body[var_names.is_enabled] = True
            if settings.TEST_MODE:
                return JsonResponse('API key has been enabled', safe=False)
            else:
                status, output = helpers.post_api_request(api_paths.edit_api_key, body, request)
                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 disable_api_key(request):
    '''
    Disables an API key.
    :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())
            body[var_names.is_enabled] = False
            if settings.TEST_MODE:
                return JsonResponse('API key has been disabled', safe=False)
            else:
                status, output = helpers.post_api_request(api_paths.edit_api_key, body, request)
                return JsonResponse(output, status=status, safe=False)
        else:
            return JsonResponse(lt.get_label(lnm.err_unauthorized_access, lang), status=401, safe=False)
