# By: Riasat Ullah
# This file contains views for teams.


from constants import api_paths, label_names as lnm, pages, var_names
from constants import component_names as cnm
from context_manager import configurations_context, users_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_teams
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_team_list(request):
    '''
    Returns the list of all teams.
    :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_teams, nav_bar_components
            )
            if not has_view_perm:
                raise exceptions.PermissionDenied

            context = configurations_context.get_team_list_context(lang, nav_bar_components)
            context[var_names.has_edit_permission] = has_edit_perm
            return render(request, pages.team_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_teams.teams_basic_list, safe=False)
            else:
                body = dict()
                status, output = helpers.post_api_request(api_paths.teams_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 get_my_team_list(request):
    '''
    Returns the list of the teams that the user is a member of.
    :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):
            if settings.TEST_MODE:
                return JsonResponse(test_data_teams.teams_basic_list[0:2], safe=False)
            else:
                body = dict()
                status, output = helpers.post_api_request(api_paths.teams_list_mine, 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 get_team_details(request, team_ref_id=None):
    '''
    GET: Gets the page for editing a team.
    POST: Gets the details of an existing team given its reference ID.
    :param request: Http request
    :param team_ref_id: reference ID of the team
    :return: GET: html page  |  POST: details of the team
    '''
    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_teams, nav_bar_components
            )
            if not has_view_perm:
                raise exceptions.PermissionDenied

            context = configurations_context.get_team_details_context(lang, nav_bar_components)
            context[var_names.context] = json.dumps({var_names.team_ref_id: team_ref_id})
            context[var_names.has_edit_permission] = has_edit_perm
            context[var_names.has_contextual_search_permission] = request_validator.has_edit_permission(
                request, cnm.dis_com_tags)
            context[var_names.has_groups_permission] = request_validator.has_edit_permission(
                request, cnm.dis_com_itsm_groups)
            context[var_names.user_role_items] = users_context.get_team_roles_content(context)

            return render(request, pages.team_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):
            if settings.TEST_MODE:
                return JsonResponse(test_data_teams.team_details[team_ref_id], safe=False)
            else:
                body = {var_names.team_ref_id: team_ref_id}
                status, output = helpers.post_api_request(api_paths.teams_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(['GET', 'POST'])
def create_team(request):
    '''
    Create a new team.
    :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_edit_perm = request_validator.has_edit_permission(request, cnm.dis_com_teams)
            if not has_edit_perm:
                raise exceptions.PermissionDenied

            context = configurations_context.get_team_new_context(lang, nav_bar_components)
            context[var_names.user_role_items] = users_context.get_team_roles_content(context)
            return render(request, pages.team_new_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:
                return JsonResponse('Action performed successfully', status=200, safe=False)
            else:
                status, output = helpers.post_api_request(api_paths.teams_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_team(request):
    '''
    Edit a team.
    :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.teams_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_team(request):
    '''
    Delete a team.
    :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.teams_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 add_team_member(request):
    '''
    Adds a new team member.
    :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.teams_members_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 edit_team_member_role(request):
    '''
    Edits the role of a team member.
    :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.teams_members_edit_role, 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_team_member(request):
    '''
    Deletes a team member.
    :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.teams_members_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 add_team_component(request):
    '''
    Adds a team component.
    :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.teams_components_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_team_component(request):
    '''
    Deletes a team component.
    :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.teams_components_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)
