# By: Riasat Ullah
# This file contains all analytics views.

from analytics.business_impact_analytics import BusinessImpactAnalytics
from analytics.incident_analytics import IncidentAnalytics
from analytics.live_call_analytics import LiveCallAnalytics
from analytics.service_analytics import ServiceAnalytics
from analytics.team_analytics import TeamAnalytics
from analytics.user_analytics import UserAnalytics
from dbqueries import db_analytics, db_policies, db_users
from exceptions.user_exceptions import InvalidRequest, UnauthorizedRequest
from modules import on_call_manager
from rest_framework.decorators import api_view
from rest_framework.response import Response
from translators import label_translator as _lt
from utils import errors, key_manager, logging, permissions, times, tokenizer, var_names
from utils.db_connection import CONN_POOL
from validations import request_validator
import configuration as configs
import jwt


@api_view(['POST'])
def dashboard_data_package(request, conn=None):
    '''
    Gets the set of information needed to be displayed on the dashboard.
    :param request: Http request
    :param conn: db connection
    :return: JSON response -> dict
    '''
    if request.method == 'POST':
        lang = request_validator.get_user_language(request)
        optional_fields = [var_names.data_type]
        try:
            conn = CONN_POOL.get_db_conn() if conn is None else conn
            request_validator.validate_fields(request, [], optional_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 = request.data[var_names.data_type]\
                if var_names.data_type in request.data else [var_names.incidents, var_names.on_call]
            current_time = times.get_current_timestamp()

            if permissions.has_user_permission(user_perm, permissions.USER_COMPONENTS_VIEW_PERMISSION):
                data = dict()
                if var_names.incidents in data_type:
                    open_count, acknowledged_count, resolved_count = db_analytics.get_open_and_acknowledged_count(
                        conn, current_time, user_id, org_id, check_adv_perm=do_adv_check
                    )
                    data[var_names.open_incident_count] = open_count
                    data[var_names.acknowledged_incident_count] = acknowledged_count
                    data[var_names.resolved_incident_count] = resolved_count

                if var_names.on_call in data_type:
                    usr_obj = db_users.get_user(conn, current_time, user_id=user_id)[user_id]
                    policy_data = db_policies.get_historical_policies(conn, current_time, current_time, org_id, user_id)
                    on_call_shifts, curr_on_call, next_on_call = on_call_manager.get_on_call_roles(
                        policy_data, usr_obj.policy_id, usr_obj.timezone, current_time,
                        configs.next_on_call_look_forward
                    )
                    data[var_names.on_call_shifts] = on_call_shifts
                    data[var_names.on_call] = curr_on_call
                    data[var_names.next_on_call] = next_on_call

                return Response(data)
            else:
                return Response(dict())
        except InvalidRequest 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)


@api_view(['POST'])
def aggregate_notifications_count(request, conn=None):
    '''
    Get the aggregate notifications count.
    :param request: Http request
    :param conn: db connection
    :return: JSON response
    '''
    if request.method == 'POST':
        lang = request_validator.get_user_language(request)
        expected_fields = [var_names.start_date, var_names.end_date]
        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)

            if permissions.has_org_permission(org_perm, permissions.ORG_ANALYTICS_BASIC_PERMISSION):
                if permissions.can_user_view_analytics(user_perm):

                    start_date = times.get_date_from_string(request.data[var_names.start_date])
                    end_date = times.get_date_from_string(request.data[var_names.end_date])

                    metrics = db_analytics.get_aggregate_notifications_count(conn, org_id, start_date, end_date)
                    return Response(metrics)
                else:
                    return Response(_lt.get_label(errors.err_user_rights, lang), status=403)
            else:
                return Response(_lt.get_label(errors.err_subscription_rights, lang), status=403)
        except InvalidRequest 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 KeyError as e:
            logging.exception(str(e))
            return Response(_lt.get_label(errors.err_unknown_resource, lang), status=400)
        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)


@api_view(['POST'])
def day_notifications(request, conn=None):
    '''
    Get the list of all notifications of a particular day.
    :param request: Http request
    :param conn: db connection
    :return: JSON response
    '''
    if request.method == 'POST':
        lang = request_validator.get_user_language(request)
        expected_fields = [var_names.notification_date]
        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)

            if permissions.has_org_permission(org_perm, permissions.ORG_ANALYTICS_BASIC_PERMISSION):
                if permissions.can_user_view_analytics(user_perm):

                    start_date = times.get_date_from_string(request.data[var_names.notification_date])

                    metrics = db_analytics.get_day_notifications(conn, org_id, start_date)
                    return Response(metrics)
                else:
                    return Response(_lt.get_label(errors.err_user_rights, lang), status=403)
            else:
                return Response(_lt.get_label(errors.err_subscription_rights, lang), status=403)
        except InvalidRequest 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 KeyError as e:
            logging.exception(str(e))
            return Response(_lt.get_label(errors.err_unknown_resource, lang), status=400)
        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)


@api_view(['POST'])
def incident_analytics(request, conn=None):
    '''
    Gets the data for incident analytics. Although this type of analytics is available for all subscriptions,
    filtering by escalation policies, services and teams are only available for plans with "secondary" analytics
    permission.
    :param request: Http request
    :param conn: db connection
    :return: JSON response
    '''
    if request.method == 'POST':
        lang = request_validator.get_user_language(request)
        expected_fields = [var_names.start_date, var_names.end_date, var_names.timezone]
        optional_fields = [var_names.urgency_level, var_names.policies, var_names.services, var_names.teams,
                           var_names.tags]
        try:
            conn = CONN_POOL.get_db_conn() if conn is None else conn
            request_validator.validate_fields(request, expected_fields, optional_fields)
            user_id, org_id, user_perm, org_perm = tokenizer.authorize_request(request)

            start_date = times.get_date_from_string(request.data[var_names.start_date])
            end_date = times.get_date_from_string(request.data[var_names.end_date])
            req_tz = request.data[var_names.timezone]
            urg_lvls = request.data[var_names.urgency_level] if var_names.urgency_level in request.data else None
            pol_refs = [key_manager.unmask_reference_key(x) for x in request.data[var_names.policies]]\
                if var_names.policies in request.data else None
            serv_refs = [key_manager.unmask_reference_key(x) for x in request.data[var_names.services]]\
                if var_names.services in request.data else None
            team_refs = [key_manager.unmask_reference_key(x) for x in request.data[var_names.teams]]\
                if var_names.teams in request.data else None
            tags = request.data[var_names.tags] if var_names.tags in request.data else None
            current_time = times.get_current_timestamp()

            if not permissions.has_org_permission(org_perm, permissions.ORG_ANALYTICS_BASIC_PERMISSION):
                return Response(_lt.get_label(errors.err_subscription_rights, lang), status=403)

            if ((pol_refs is not None or serv_refs is not None or team_refs is not None)
                and not permissions.has_org_permission(org_perm, permissions.ORG_ANALYTICS_SECONDARY_PERMISSION))\
                    or (tags is not None
                        and not permissions.has_org_permission(org_perm, permissions.ORG_CONTEXTUAL_SEARCH_PERMISSION)):
                return Response(_lt.get_label(errors.err_subscription_rights, lang), status=403)

            if not permissions.can_user_view_analytics(user_perm):
                return Response(_lt.get_label(errors.err_user_rights, lang), status=403)

            do_adv_check = permissions.get_user_advanced_check_status(user_perm, org_perm)[0]
            analytics_maker = IncidentAnalytics(conn, current_time, org_id, start_date, end_date, req_tz,
                                                urgency_levels=urg_lvls, policy_refs=pol_refs, service_refs=serv_refs,
                                                team_refs=team_refs, tags=tags,
                                                user_id=user_id if do_adv_check else None)
            return Response(analytics_maker.get_metrics())
        except InvalidRequest 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)


@api_view(['POST'])
def user_summary_analytics(request, conn=None):
    '''
    Gets performance related metrics of all users of the organization.
    :param request: Http request
    :param conn: db connection
    :return: JSON response -> dict
    '''
    if request.method == 'POST':
        lang = request_validator.get_user_language(request)
        expected_fields = [var_names.start_date, var_names.end_date]
        optional_fields = [var_names.tags]
        try:
            conn = CONN_POOL.get_db_conn() if conn is None else conn
            request_validator.validate_fields(request, expected_fields, optional_fields)
            user_id, org_id, user_perm, org_perm = tokenizer.authorize_request(request)

            if permissions.has_org_permission(org_perm, permissions.ORG_ANALYTICS_SECONDARY_PERMISSION):
                if permissions.can_user_view_analytics(user_perm):

                    start_date = times.get_date_from_string(request.data[var_names.start_date])
                    end_date = times.get_date_from_string(request.data[var_names.end_date])
                    tags = request.data[var_names.tags] if var_names.tags in request.data else None
                    current_time = times.get_current_timestamp()

                    analytics_maker = UserAnalytics(conn, current_time, org_id, start_date, end_date, tags=tags)
                    return Response(analytics_maker.get_org_users_performance_metrics_summary())
                else:
                    return Response(_lt.get_label(errors.err_user_rights, lang), status=403)
            else:
                return Response(_lt.get_label(errors.err_subscription_rights, lang), status=403)
        except InvalidRequest 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)


@api_view(['POST'])
def user_detailed_analytics(request, conn=None):
    '''
    Get detailed analytics metrics specific to a user.
    :param request: Http request
    :param conn: db connection
    :return: JSON response
    '''
    if request.method == 'POST':
        lang = request_validator.get_user_language(request)
        expected_fields = [var_names.preferred_username, var_names.start_date, var_names.end_date]
        optional_fields = [var_names.tags]
        try:
            conn = CONN_POOL.get_db_conn() if conn is None else conn
            request_validator.validate_fields(request, expected_fields, optional_fields)
            user_id, org_id, user_perm, org_perm = tokenizer.authorize_request(request)

            if permissions.has_org_permission(org_perm, permissions.ORG_ANALYTICS_SECONDARY_PERMISSION):
                if permissions.can_user_view_analytics(user_perm):

                    req_pref_name = request.data[var_names.preferred_username]
                    start_date = times.get_date_from_string(request.data[var_names.start_date])
                    end_date = times.get_date_from_string(request.data[var_names.end_date])
                    tags = request.data[var_names.tags] if var_names.tags in request.data else None
                    current_time = times.get_current_timestamp()

                    req_user_id = db_users.get_user_ids_from_preferred_usernames(
                        conn, current_time, org_id, [req_pref_name])

                    if len(req_user_id) == 0:
                        return Response(_lt.get_label(errors.err_unknown_resource, lang), status=401)
                    else:
                        req_user_id = req_user_id[0]

                    analytics_maker = UserAnalytics(conn, current_time, org_id, start_date, end_date,
                                                    user_id=req_user_id, tags=tags)
                    return Response(analytics_maker.get_user_specific_detailed_metrics())
                else:
                    return Response(_lt.get_label(errors.err_user_rights, lang), status=403)
            else:
                return Response(_lt.get_label(errors.err_subscription_rights, lang), status=403)
        except InvalidRequest 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 KeyError as e:
            logging.exception(str(e))
            return Response(_lt.get_label(errors.err_unknown_resource, lang), status=400)
        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)


@api_view(['POST'])
def team_analytics(request, conn=None):
    '''
    Get team analytics. It is only available for plans with secondary analytics permission.
    :param request: Http request
    :param conn: database connection
    :return: JSON response
    '''
    if request.method == 'POST':
        lang = request_validator.get_user_language(request)
        expected_fields = [var_names.start_date, var_names.end_date, var_names.timezone]
        optional_fields = [var_names.teams, var_names.urgency_level, var_names.tags]
        try:
            conn = CONN_POOL.get_db_conn() if conn is None else conn
            request_validator.validate_fields(request, expected_fields, optional_fields)
            user_id, org_id, user_perm, org_perm = tokenizer.authorize_request(request)

            if permissions.has_org_permission(org_perm, permissions.ORG_ANALYTICS_SECONDARY_PERMISSION):
                if permissions.can_user_view_analytics(user_perm):
                    start_date = times.get_date_from_string(request.data[var_names.start_date])
                    end_date = times.get_date_from_string(request.data[var_names.end_date])
                    req_tz = request.data[var_names.timezone]
                    team_refs = [key_manager.unmask_reference_key(x) for x in request.data[var_names.teams]]\
                        if var_names.teams in request.data else None
                    urg_lvls = request.data[var_names.urgency_level]\
                        if var_names.urgency_level in request.data else None
                    tags = request.data[var_names.tags] if var_names.tags in request.data else None

                    do_adv_check = permissions.get_user_advanced_check_status(user_perm, org_perm)[0]
                    analytics_maker = TeamAnalytics(conn, org_id, start_date, end_date, req_tz,
                                                    urgency_levels=urg_lvls, team_refs=team_refs, tags=tags,
                                                    user_id=user_id if do_adv_check else None)
                    return Response(analytics_maker.get_metrics())
                else:
                    return Response(_lt.get_label(errors.err_user_rights, lang), status=403)
            else:
                return Response(_lt.get_label(errors.err_subscription_rights, lang), status=403)
        except (InvalidRequest, LookupError) 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 KeyError as e:
            logging.exception(str(e))
            return Response(_lt.get_label(errors.err_unknown_resource, lang), status=400)
        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)


@api_view(['POST'])
def service_analytics(request, conn=None):
    '''
    Get service analytics. It is only available for plans with advanced analytics permission (highest tier).
    :param request: Http request
    :param conn: database connection
    :return: JSON response
    '''
    if request.method == 'POST':
        lang = request_validator.get_user_language(request)
        expected_fields = [var_names.start_date, var_names.end_date, var_names.timezone]
        optional_fields = [var_names.services, var_names.teams, var_names.tags]
        try:
            conn = CONN_POOL.get_db_conn() if conn is None else conn
            request_validator.validate_fields(request, expected_fields, optional_fields)
            user_id, org_id, user_perm, org_perm = tokenizer.authorize_request(request)

            if permissions.has_org_permission(org_perm, permissions.ORG_ANALYTICS_SECONDARY_PERMISSION):
                if permissions.can_user_view_analytics(user_perm):

                    start_date = times.get_date_from_string(request.data[var_names.start_date])
                    end_date = times.get_date_from_string(request.data[var_names.end_date])
                    req_tz = request.data[var_names.timezone]
                    serv_refs = [key_manager.unmask_reference_key(x) for x in request.data[var_names.services]]\
                        if var_names.services in request.data else None
                    team_refs = [key_manager.unmask_reference_key(x) for x in request.data[var_names.teams]]\
                        if var_names.teams in request.data else None
                    tags = request.data[var_names.tags] if var_names.tags in request.data else None
                    current_time = times.get_current_timestamp()

                    do_adv_check = permissions.get_user_advanced_check_status(user_perm, org_perm)[0]
                    analytics_maker = ServiceAnalytics(conn, current_time, org_id, start_date, end_date, req_tz,
                                                       service_refs=serv_refs, team_refs=team_refs, tags=tags,
                                                       user_id=user_id if do_adv_check else None)
                    return Response(analytics_maker.get_metrics())
                else:
                    return Response(_lt.get_label(errors.err_user_rights, lang), status=403)
            else:
                return Response(_lt.get_label(errors.err_subscription_rights, lang), status=403)
        except InvalidRequest 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 KeyError as e:
            logging.exception(str(e))
            return Response(_lt.get_label(errors.err_unknown_resource, lang), status=400)
        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)


@api_view(['POST'])
def business_impact_analytics(request, conn=None):
    '''
    Get business impact analytics. It is only available for plans with advanced analytics permission (highest tier).
    :param request: Http request
    :param conn: database connection
    :return: JSON response
    '''
    if request.method == 'POST':
        lang = request_validator.get_user_language(request)
        expected_fields = [var_names.start_date, var_names.end_date, var_names.timezone]
        optional_fields = [var_names.teams, var_names.business_cost, var_names.labor_cost, var_names.tags]
        try:
            conn = CONN_POOL.get_db_conn() if conn is None else conn
            request_validator.validate_fields(request, expected_fields, optional_fields)
            user_id, org_id, user_perm, org_perm = tokenizer.authorize_request(request)

            if permissions.has_org_permission(org_perm, permissions.ORG_ANALYTICS_SECONDARY_PERMISSION):
                if permissions.can_user_view_analytics(user_perm):

                    start_date = times.get_date_from_string(request.data[var_names.start_date])
                    end_date = times.get_date_from_string(request.data[var_names.end_date])
                    req_tz = request.data[var_names.timezone]
                    team_refs = [key_manager.unmask_reference_key(x) for x in request.data[var_names.teams]]\
                        if var_names.teams in request.data else None
                    bus_cost = request.data[var_names.business_cost]\
                        if var_names.business_cost in request.data else None
                    labor_cost = request.data[var_names.labor_cost] if var_names.labor_cost in request.data else None
                    tags = request.data[var_names.tags] if var_names.tags in request.data else None
                    current_time = times.get_current_timestamp()

                    do_adv_check = permissions.get_user_advanced_check_status(user_perm, org_perm)[0]
                    analytics_maker = BusinessImpactAnalytics(conn, current_time, org_id, start_date, end_date, req_tz,
                                                              team_refs=team_refs, hourly_business_loss=bus_cost,
                                                              hourly_labor_cost=labor_cost, tags=tags,
                                                              user_id=user_id if do_adv_check else None)
                    return Response(analytics_maker.get_metrics())
                else:
                    return Response(_lt.get_label(errors.err_user_rights, lang), status=403)
            else:
                return Response(_lt.get_label(errors.err_subscription_rights, lang), status=403)
        except InvalidRequest 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 KeyError as e:
            logging.exception(str(e))
            return Response(_lt.get_label(errors.err_unknown_resource, lang), status=400)
        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)


@api_view(['POST'])
def live_call_analytics(request, conn=None):
    '''
    Get live call analytics. It is only available for plans with live call routing enabled.
    :param request: Http request
    :param conn: database connection
    :return: JSON response
    '''
    if request.method == 'POST':
        lang = request_validator.get_user_language(request)
        expected_fields = [var_names.start_date, var_names.end_date, var_names.timezone]
        optional_fields = [var_names.call_routing, var_names.services, var_names.teams]
        try:
            conn = CONN_POOL.get_db_conn() if conn is None else conn
            request_validator.validate_fields(request, expected_fields, optional_fields)
            user_id, org_id, user_perm, org_perm = tokenizer.authorize_request(request)

            if permissions.has_org_permission(org_perm, permissions.ORG_LIVE_CALL_ROUTING_PERMISSION):
                if permissions.can_user_view_analytics(user_perm):

                    start_date = times.get_date_from_string(request.data[var_names.start_date])
                    end_date = times.get_date_from_string(request.data[var_names.end_date])
                    req_tz = request.data[var_names.timezone]
                    rout_refs = [key_manager.unmask_reference_key(x) for x in request.data[var_names.call_routing]]\
                        if var_names.call_routing in request.data else None
                    serv_refs = [key_manager.unmask_reference_key(x) for x in request.data[var_names.services]]\
                        if var_names.services in request.data else None
                    team_refs = [key_manager.unmask_reference_key(x) for x in request.data[var_names.teams]]\
                        if var_names.teams in request.data else None
                    current_time = times.get_current_timestamp()

                    analytics_maker = LiveCallAnalytics(conn, current_time, org_id, start_date, end_date,
                                                        call_routing_refs=rout_refs, service_refs=serv_refs,
                                                        team_refs=team_refs)

                    return Response(analytics_maker.get_metrics())
                else:
                    return Response(_lt.get_label(errors.err_user_rights, lang), status=403)
            else:
                return Response(_lt.get_label(errors.err_subscription_rights, lang), status=403)
        except InvalidRequest 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 KeyError as e:
            logging.exception(str(e))
            return Response(_lt.get_label(errors.err_unknown_resource, lang), status=400)
        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)
