# By: Riasat Ullah
# This file contains views for conference bridges.

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 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 integrations import webex, zoom
from taskcallweb import settings
from system_tests.test_data import test_data_workflows
from translators import label_translator as lt
from utils import helpers
from validations import request_validator
import json
import random


@require_http_methods(['GET', 'POST'])
def get_conference_bridges_list(request):
    '''
    Returns the list of all conference bridges.
    :param request: Http request
    :return: Http 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_conference_bridges, nav_bar_components
            )
            if not has_view_perm:
                raise exceptions.PermissionDenied

            context = configurations_context.get_conference_bridges_context(lang, nav_bar_components)
            context[var_names.has_edit_permission] = has_edit_perm

            if 'error' in request.GET:
                context[var_names.error_name] = request.GET.get('error')

            return render(request, pages.conference_bridge_list_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_workflows.conference_bridges, safe=False)
            else:
                body = dict()
                status, output = helpers.post_api_request(api_paths.conference_bridges_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 create_conference_bridge(request):
    '''
    Creates a new conference bridge.
    :param request: Http request
    :return: Http 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())

            conf_type = body[var_names.integration_type]
            if conf_type is not None and conf_type in [static_vars.integ_type_webex, static_vars.integ_type_zoom]:
                new_state = helpers.generate_random_string_key()
                body[var_names.state] = new_state
                request.session[var_names.conference_bridges] = body

                if conf_type == static_vars.integ_type_webex:
                    return JsonResponse(webex.get_webex_oauth_path(new_state), status=200, safe=False)
                elif conf_type == static_vars.integ_type_zoom:
                    return JsonResponse(zoom.get_zoom_oauth_path(new_state), status=200, safe=False)

            if settings.TEST_MODE:
                return JsonResponse(random.randint(20, 10000), status=200, safe=False)
            else:
                status, output = helpers.post_api_request(api_paths.conference_bridges_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 delete_conference_bridge(request):
    '''
    Deletes a conference bridge.
    :param request: Http request
    :return: Http 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('Action performed successfully', status=200, safe=False)
            else:
                status, output = helpers.post_api_request(api_paths.conference_bridges_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)
