# By: Riasat Ullah
# This file contains views for generating component list.

from dbqueries import db_business_services, db_instance_utilities, db_integrations, db_live_call_routing, db_policies, \
    db_routines, db_services, db_tags, db_task_instances, db_teams, db_users, db_workflows
from dbqueries.itsm import db_external_sso, db_groups, db_people
from dbqueries.status_pages import db_status_pages
from exceptions.user_exceptions import InvalidRequest, UnauthorizedRequest
from rest_framework.decorators import api_view
from rest_framework.response import Response
from translators import label_translator as _lt
from utils import errors, logging, permissions, times, tokenizer, var_names
from utils.db_connection import CONN_POOL
from validations import request_validator
import configuration
import jwt


@api_view(['POST'])
def get_component_list(request, conn=None):
    '''
    Get the list of components given the type of component(s).
    :param request: Http request
    :param conn: db connection
    :return: Http response
    '''
    if request.method == 'POST':
        lang = request_validator.get_user_language(request)
        expected_fields = [var_names.data_type]
        try:
            conn = CONN_POOL.get_db_conn() if conn is None else conn
            request_validator.validate_fields(request, expected_fields)
            user_id, org_id, user_perm, org_perm = tokenizer.authorize_request(request)
            do_adv_check = permissions.get_user_advanced_check_status(user_perm, org_perm)[0]
            data_type = set(request.data[var_names.data_type])
            current_time = times.get_current_timestamp()

            if data_type == {var_names.users}:
                data = db_users.get_basic_user_list(conn, current_time, org_id)

            elif data_type == {var_names.routines}:
                data = db_routines.get_basic_routines_list(conn, current_time, org_id, group_only=True)

            elif data_type == {var_names.routines, var_names.users}:
                data = db_routines.get_basic_routines_list(conn, current_time, org_id, group_only=False)

            elif data_type == {var_names.policies}:
                data = db_policies.get_basic_policies_list(conn, current_time, org_id, group_only=True,
                                                           user_id=user_id if do_adv_check else None)

            elif data_type == {var_names.policies, var_names.users}:
                data = db_policies.get_basic_policies_list(conn, current_time, org_id, group_only=False,
                                                           user_id=user_id if do_adv_check else None)

            elif data_type == {var_names.services}:
                data = db_services.get_basic_services_list(conn, current_time, org_id,
                                                           user_id=user_id if do_adv_check else None)

            elif data_type == {var_names.business_services}:
                data = db_business_services.get_basic_business_services_list(conn, current_time, org_id)

            elif data_type == {var_names.response_sets}:
                data = []

            elif data_type == {var_names.workflows}:
                data = db_workflows.get_basic_workflows_list(conn, current_time, org_id)

            elif data_type == {var_names.teams}:
                data = db_teams.list_teams(conn, current_time, org_id, user_id=user_id if do_adv_check else None)

            elif data_type == {var_names.user_roles}:
                data = permissions.get_org_allowed_user_roles(org_perm)

            elif data_type == {var_names.conference_bridges}:
                data = db_instance_utilities.get_basic_conference_list(conn, current_time, org_id)

            elif data_type == {var_names.incidents}:
                data = db_task_instances.get_org_active_instances_basic_list(conn, current_time, org_id)

            elif data_type == {var_names.integrations}:
                data = db_integrations.get_available_integrations(conn, current_time)

            elif data_type == {var_names.chat_integrations}:
                data = db_integrations.get_basic_chat_integrations_list(conn, current_time, org_id)

            elif data_type == {var_names.custom_action_integrations}:
                data = db_integrations.get_basic_custom_action_integrations_list(conn, current_time, org_id)

            elif data_type == {var_names.recent_changes_integrations}:
                data = db_integrations.get_basic_recent_changes_integrations_list(conn, current_time)

            elif data_type == {var_names.tags}:
                data = db_tags.get_basic_tags_list(conn, current_time, org_id)

            elif data_type == {var_names.tags, var_names.policies}:
                data = db_tags.list_tags(conn, current_time, org_id)

            elif data_type == {var_names.tags, var_names.users}:
                data = db_tags.list_tags(conn, current_time, org_id, with_preferred_username=True)

            elif data_type == {var_names.live_call_routing}:
                data = db_live_call_routing.get_basic_live_call_routing_list(conn, current_time, org_id)

            elif data_type == {var_names.live_call_routing_countries}:
                data = configuration.allowed_live_call_routing_countries

            elif data_type == {var_names.people}:
                data = db_people.get_basic_people_list(conn, current_time, org_id)

            elif data_type == {var_names.groups}:
                data = db_groups.get_basic_groups_list(conn, current_time, org_id)

            elif data_type == {var_names.external_sso}:
                data = db_external_sso.get_basic_external_sso_list(conn, current_time, org_id)

            elif data_type == {var_names.status_pages}:
                data = db_status_pages.get_basic_status_pages_list(conn, current_time, org_id)

            else:
                logging.error(errors.err_unknown_resource + ' - ' + str(data_type))
                raise InvalidRequest(errors.err_unknown_resource)

            return Response(data)
        except (InvalidRequest, ValueError) as e:
            logging.exception(str(e))
            return Response(_lt.get_label(str(e), lang), status=400)
        except (UnauthorizedRequest, jwt.ExpiredSignatureError, jwt.InvalidSignatureError) as e:
            logging.exception(str(e))
            return Response(_lt.get_label(errors.err_authorization, lang), status=401)
        except Exception as e:
            logging.exception(str(e))
            return Response(_lt.get_label(errors.err_system_error, lang), status=500)
        finally:
            CONN_POOL.put_db_conn(conn)
