from .services.base_service import Base_service
import sys
import os
import re
from py_module.whiptail import Whiptail
import py_module.yaml as yaml
import py_module.docker as docker
import py_module.jinja2 as jinja
import subprocess
import json
import string
import uuid
import configparser
import fileinput
from .docker_installer import Docker_installer
from .services import *


class Int_With_Kerberos(Base_service):
    def preload(self):
        with Docker_installer(logger_level = self.logger_level) as run:
            pass
        self.logger.info('Инициализирую основные переменные')

        if not self.DETALIZATION:
            self.DETALIZATION = 1
        self.INSTALL_DUMP_PATH='./images'
        self.INSTALL_CONF_PATH='./configs'
        self.BACK_MENU=[False]
        
### ENVIRONMENT GERENAL
        self.DETALIZATION = 1

### ENVIRONMENT TEAM
#env for rabbit
        self.dockercli = docker.from_env();

# #        self.NODE_FRONTEND_CERT_WILDCARD
        self.GENERAL_NODE_LOGS_STORAGE=['./support_logs']

        self.TEAM_CERT_CRT_PATH=['./config']
        self.TEAM_CERT_CRT_FILE=['fullchain.crt']
        self.TEAM_CERT_KEY_PATH=['./config']
        self.TEAM_CERT_KEY_FILE=['privkey.key']
        self.TEAM_HTTPS_PUBLISH_PORT=['443']
        self.TEAM_HTTP_PUBLISH_PORT=['80']
        self.TEAM_UUID=['']
        self.TEAM_TOKEN=['']
        self.TEAM_HASH=['hash']        
### ENVIRONMENT SSO
        self.CS_SSO_IDP_METADATA=['https://keycloack.ru/realms/{имя realm}/protocol/saml/descriptor']
        self.CS_SSO_SAML_SIGNATUREALGORITM=['http://www.w3.org/2001/04/xmldsig-more#rsa-sha256']
        self.CS_SSO_ISSUER=['https://disk.domain.ru/saml2/Metadata']
        self.CS_SSO_SIGN_CERT=['keytab.data']
        self.CS_SSO_SIGN_CERT_PWD=['']
        self.CS_SSO_CERT_VALID_MODE=['None']
        self.CS_SSO_REVOCATION_MODE=['NoCheck']
        self.CS_SSO_KEYTAB=['keytab.data']

        self.select_components=None
        self.dockercli = docker.from_env();

    def postload(self, **kwarg):
        self.get_requests(**kwarg);
        if self.BACK_MENU[0]==True:
            return        
        self.build_configs();
        self.deploy();
        return self;

    def build_configs(self):

        with open(f'{self.INSTALL_CONF_PATH}/api/appsettings.json', 'r', encoding='utf-8') as file:
            jfile = json.load(file)
        jfile["esiaType"] = "kerberos"
        jfile["keyTabFile"] = "keytab.data"
            
        with open(f'{self.INSTALL_CONF_PATH}/api/appsettings.json', 'w', encoding='utf-8') as file:
            json.dump(jfile, file, ensure_ascii=False, indent=2)

        
    def deploy(self):
        if self.form.yesno("Для применения изменений необходимо выполнить перезапуск контейнеров, выполнить?", default="yes"):
            print (f'\n\nИзменяю параметры контейнеров.\n\n############\n#### ВНИМАНИЕ: НЕ ОСТАНАВЛИВАЙТЕ ПРОЦЕСС\n############\n\n');
            command = [f'{sys.path[0]}/runtime/docker/docker', 'compose', '-f', f'{sys.path[0]}/template.yaml', 'up', '--force-recreate', '-d', '-V']
            result = subprocess.run(command)
            if result.returncode != 0:
                self.logger.error(f'При попытке запуска команды ({command}) произошли ошибки')
                self.logger.error(result.stderr)
                self.msgbox(f'Интеграция не выполнена. Обратитесь в техподдержку Р7-Офис')
            else:
                self.logger.debug(result.stdout)
                self.logger.info('Docker Compose Plugin завершился без ошибок.')
                self.msgbox(f'Настройки интеграции Корпоративного сервера Р7 с Kerberos выполнены');
            pass
        else:
            return
    def get_requests(self, dialog: list = None, external:bool = False, **kwarg):
        dialogs = dialog if isinstance(dialog, list) else [
            {
                "env": ('CS_SSO_SIGN_CERT'),
                "default": f"{self.CS_SSO_SIGN_CERT[0]}",
                "enable": None,
                "msg": (
                    f'Настройка интеграции Корпоративный сервер Р7 с Keycloak:\n\nВведите имя файла Kerberos',
                    f'Имя файла обязательно к заполнению.',
                ),
                "func_check": self.check_default(),
                "func_visibility": self.visibility_default(),
                "detalization": 1
            },
        ];
        self.get_dialogs(dialogs)
