# By: Riasat Ullah
# This file contains views for previewing status pages.

from dbqueries.status_pages import db_status_page_previews
from exceptions.user_exceptions import 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 jwt


@api_view(['POST'])
def preview_current_status(request, conn=None):
    '''
    Get the details needed to preview a status page. This will get the status page configurations in its current state.
    :param request: Http request
    :param conn: db connection
    :return: JSON response -> dict of page details
    '''
    if request.method == 'POST':
        lang = request_validator.get_user_language(request)
        expected_fields = [var_names.page_ref_id, var_names.with_posts]
        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 not permissions.has_org_permission(org_perm, permissions.ORG_STATUS_PAGES_PERMISSION):
                return Response(_lt.get_label(errors.err_subscription_rights, lang), status=403)
            if not permissions.has_user_permission(user_perm, permissions.USER_STATUS_PAGES_PERMISSION):
                return Response(_lt.get_label(errors.err_user_rights, lang), status=403)

            current_time = times.get_current_timestamp()
            page_ref_id = request.data[var_names.page_ref_id]
            page_details = db_status_page_previews.get_status_page_current_status(
                conn, current_time, is_published=False, page_ref_id=page_ref_id)
            if not request.data[var_names.with_posts]:
                del page_details[var_names.posts]
            if page_details is None:
                raise LookupError(errors.err_unknown_resource)
            else:
                return Response(page_details)
        except 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 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 preview_published_posts(request, conn=None):
    '''
    Get the preview of status page posts.
    :param request: Http request
    :param conn: db connection
    :return: JSON response -> dict of page details
    '''
    if request.method == 'POST':
        lang = request_validator.get_user_language(request)
        expected_fields = [var_names.page_ref_id, var_names.start_period, var_names.end_period,
                           var_names.is_maintenance]
        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 not permissions.has_org_permission(org_perm, permissions.ORG_STATUS_PAGES_PERMISSION):
                return Response(_lt.get_label(errors.err_subscription_rights, lang), status=403)
            if not permissions.has_user_permission(user_perm, permissions.USER_STATUS_PAGES_PERMISSION):
                return Response(_lt.get_label(errors.err_user_rights, lang), status=403)

            current_time = times.get_current_timestamp()
            page_ref_id = request.data[var_names.page_ref_id]
            start_period = times.get_timestamp_from_string(request.data[var_names.start_period]).date()
            end_period = times.get_timestamp_from_string(request.data[var_names.end_period]).date()
            is_maintenance = request.data[var_names.is_maintenance]

            posts = db_status_page_previews.get_status_page_published_posts(
                conn, current_time, check_start=start_period, check_end=end_period, for_published_page=False,
                page_ref_id=page_ref_id, organization_id=org_id, is_maintenance=is_maintenance,
                is_open=None if is_maintenance else False
            )
            return Response(posts)
        except 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 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)
