# By: Riasat Ullah
# This file serves incident related informational docs.

from botocore.exceptions import ClientError
from constants import pages, var_names
from django.http import Http404
from django.shortcuts import redirect, render
from django.views.decorators.http import require_http_methods
from taskcallinfo import settings
from utils import file_storage, logging, s3
import json
import yaml


@require_http_methods(['GET'])
def get_doc_index_page(request):
    if request.method == 'GET':
        return render(request, pages.docs_index_page)


@require_http_methods(['GET'])
def get_doc_page(request, doc_type, version, doc_name):
    '''
    Gets the html page for the document requested.
    :param request: Http request
    :param doc_type: the type of doc -> incidents, integrations, configurations, etc
    :param version: document version number -> 1, 2, etc
    :param doc_name: name of the document
    :return: Http response
    '''
    if request.method == 'GET':
        try:
            if settings.TEST_MODE:
                docs_list_file_path = '\\'.join([file_storage.TEST_DATA_LOCAL_LOCATION, 'docs_list.yaml'])
                with open(docs_list_file_path, 'r') as file:
                    docs_list = yaml.safe_load(file)

                file_path = '\\'.join([file_storage.TEST_DATA_LOCAL_DOCS_LOCATION,
                                       doc_type, doc_name + '.yaml'])
                with open(file_path, 'r') as file:
                    page_context = yaml.safe_load(file)
            else:
                docs_list = s3.read_yaml('taskcall-prod-data', 'docs_list/docs_list.yaml')

                s3_key = '/'.join(['docs', doc_type, version, doc_name + '.yaml'])
                page_context = s3.read_yaml('taskcall-public-data', s3_key)

            if var_names.schema_markup in page_context:
                page_context[var_names.schema_markup] = json.dumps(page_context[var_names.schema_markup])

            context = {**page_context, **{var_names.nav_content: docs_list}}
            return render(request, pages.docs_template_page, context=context)
        except ClientError as e:
            if e.response["Error"]["Code"] == "NoSuchKey":
                logging.exception(request.path)
                raise Http404


@require_http_methods(['GET'])
def redirect_doc_index_page(request):
    '''
    Redirect the docs index page under the docs subdomain to the main site docs resource.
    :param request: Http request
    :return: Redirect response
    '''
    if request.method == 'GET':
        return redirect(pages.docs_url, status=301, permanent=True)


@require_http_methods(['GET'])
def redirect_doc_page(request, doc_type, version, doc_name):
    '''
    Redirects a doc page from the docs subdomain site to the main site docs resource.
    :param request: Http request
    :param doc_type: the type of doc -> incidents, integrations, configurations, etc
    :param version: document version number -> 1, 2, etc
    :param doc_name: name of the document
    :return: Redirect response
    '''
    if request.method == 'GET':
        new_page_url = '/'.join([pages.docs_url, doc_type, version, doc_name])
        return redirect(new_page_url, status=301, permanent=True)
