#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Дата оптимизации: 09.06.2022
Дата тестирования: 14.06.2022
"""
import os

# Активация FLASK
from app import app  # чтение из config.py
from flask import render_template  # использование шаблонов
# from flask import request  # получение данных Cookie, GET и  POST
from flask import jsonify  # ответ в формате JSON
# from flask import redirect  # Код страницы и перенаравление
# import json
import sys
import configparser
import importlib.util

# Подключаем свои библиотеки
sys.path.append("app/source")
import API_Common as APIC
import API_App
# import API_MSSQL
# import API_App


###############################################################################
# Проверка сессии
###############################################################################
def CheckSession(SessionID):
    if SessionID is not None:
        if (SessionID != ""):
            CurDataSession: APIC.DataSession = APIC.CheckSession(SessionID, True)
            if (CurDataSession.status == False): return False

            CurSessionID = CurDataSession.sessionid

            # Если нет в базе такой сессии, то заного авторизуемся
            if (CurSessionID == ""): return False

            return True
        else:
            return False
    else:
        return False


###############################################################################
# POST
###############################################################################
def API(SessionID, CurPage):
    config = configparser.ConfigParser()
    config.read("app/pages/" + CurPage + "/config.ini")

    VarArray = {}
    if (CheckSession(SessionID) == False) and config["ACCESS"]["NeedAuth"] == 1:
        return "Требуется повторная авторизация. Нажмите F5.", 401

    if (CurPage != ""):
        spec = importlib.util.spec_from_file_location("module.name", f"app/pages/{CurPage}/source.py")
        CurPage = importlib.util.module_from_spec(spec)
        spec.loader.exec_module(CurPage)
        return CurPage.API(SessionID)

    VarArray.update({'status': 'Неизвестная операция'})
    return jsonify(VarArray)


###############################################################################
# MAIN
###############################################################################
def Main(SessionID, CurPage):
    # Объявление переменных
    Var = {"Title": "", "ProgName": app.config['PROGNAME']}
    Modal_Vars = {}

    S = APIC.CheckSession(SessionID, False)

    # Получаем уровень доступа
    if (S.userid not in ("-1", "")):
        UserData: API_MSSQL.Result = API_App.GetDataUserByID(APIC.ReadDataSession(SessionID, "userid"))

    # Создаем страничку
    try:
        if (CurPage is None):
            return render_template('Pages.htm', head=APIC.UserHead(Var)  # Подключаем раздел head со скриптами и css
                                   , UserHeader=APIC.UserHeader(SessionID, Var)  # Рисуем шапку на странице
                                   , Modals=APIC.Modals(Modal_Vars)  # Модальные окна
                                   , ThreadVars_message=APIC.ThreadVars_Message()  #
                                   , version=app.config['VERSION']  #
                                   , R_category="{{R.category}}"  #
                                   , R_name="{{R.name}}"  #
                                   , R_description="{{R.description}}"  #
                                   , R_autor="{{R.autor}}"  #
                                   , R_tags="{{R.tags}}"  #
                                   , CurTag="{{CurTag}}"  #
                                   )

        # Если вошли в режиме Установщика то проверку не проверяем
        if (S.userid != "-1"):
            # Проверка прав на модуль
            if (os.path.isfile("app/pages/" + CurPage + "/config.ini") == False):
                return render_template('error_403.htm', head=APIC.UserHead(Var)  # Подключаем раздел head со скриптами и css
                                       , UserHeader=APIC.UserErrorHeader(SessionID, Var)  # Рисуем шапку на странице
                                       , ThreadVars_message=f"Не удалось получить настройки для страницы {CurPage}. Похоже, эта страница на стадии разработки")

            config = configparser.ConfigParser()
            config.read("app/pages/" + CurPage + "/config.ini")

            if (config["ACCESS"]["UserInterFace"] not in ("0", "")):
                if (
                        str(UserData.GetRecord(0, "UserInterFace")) not in config["ACCESS"]["UserInterFace"].split(',')
                        # or AccessOMS < int(config["ACCESS"]["AccessOMS"])
                        or int(UserData.GetRecord(0, "AccessOMS")) < int(config["ACCESS"]["AccessOMS"])
                        or int(UserData.GetRecord(0, "AccessLPU")) < int(config["ACCESS"]["AccessLPU"])
                        or int(UserData.GetRecord(0, "AccessUOG")) < int(config["ACCESS"]["AccessUOG"])
                        or int(UserData.GetRecord(0, "AccessENP")) < int(config["ACCESS"]["AccessENP"])
                        or int(UserData.GetRecord(0, "AccessSMS")) < int(config["ACCESS"]["AccessSMS"])
                        or int(UserData.GetRecord(0, "AccessPostCard")) < int(config["ACCESS"]["AccessPostCard"])
                        or int(UserData.GetRecord(0, "AccessPhone")) < int(config["ACCESS"]["AccessPhone"])
                        or int(UserData.GetRecord(0, "AccessDial")) < int(config["ACCESS"]["AccessDial"])
                        or int(UserData.GetRecord(0, "AccessAnkets")) < int(config["ACCESS"]["AccessAnkets"])

                ):
                    return render_template('error_403.htm', head=APIC.UserHead(Var)  # Подключаем раздел head со скриптами и css
                                           , UserHeader=APIC.UserErrorHeader(SessionID, Var)  # Рисуем шапку на странице
                                           , ThreadVars_message="Извините, но вам не хватает доступа к этой странице.")

        import importlib.util
        spec = importlib.util.spec_from_file_location("module.name", "app/pages/" + CurPage + "/source.py")
        CurPage = importlib.util.module_from_spec(spec)
        spec.loader.exec_module(CurPage)
        return CurPage.Main(SessionID)
    except Exception as E:
        return render_template('error_500.htm', head=APIC.UserHead(Var)  # Подключаем раздел head со скриптами и css
                               , UserHeader=APIC.UserHeader(SessionID, Var)  # Рисуем шапку на странице
                               , ThreadVars_message=f"При открытии страницы {CurPage} произошла ошибка: {E}")
