from .services.base_service import Base_service
import sys
import subprocess
from py_module.whiptail import Whiptail
import py_module.yaml as yaml
import py_module.docker as docker
import py_module.jinja2 as jinja
from .docker_installer import Docker_installer
from .services import *


class Trusted_Cert_Generator(Base_service):
    def preload(self):

        self.logger.info('Инициализирую основные переменные')

        if not self.DETALIZATION:
            self.DETALIZATION = 1
        self.INSTALL_DUMP_PATH='./images'
        self.INSTALL_CONF_PATH='./configs'
        self.TEAM_CONF_PATH='./configs_team'
        self.SSL_PATH=['./configs/ssl']
        self.BACK_MENU=[False]

### ENVIRONMENT GERENAL
        self.DETALIZATION = 1
        self.CS_VERSION=['2025.3.12.15877']
#        self.DS_VERSION=['latest']
        self.DS_VERSION=['2025.3.1.923']
        self.MAIL_VERSION=['1.0.35']
        self.PREFIX_CS=['cs']
        self.PREFIX_DS=['ds']
        self.PREFIX_MAIL=['mail']
        self.PREFIX_TEAM=['team']

        self.GENERAL_NODE_LOGS_STORAGE=['./support_logs']

        self.CS_NODE_FRONTEND_CERT_CRT_PATH=['./configs/ssl']
        self.CS_NODE_FRONTEND_CERT_CRT_FILE=['fullchain.crt']
        self.CS_NODE_FRONTEND_CERT_KEY_PATH=['./configs/ssl']
        self.CS_NODE_FRONTEND_CERT_KEY_FILE=['privkey.key']
        self.CS_NODE_FRONTEND_CA_PATH=['./configs/ssl']
        self.CS_NODE_FRONTEND_CA_FILE=['ca.pem']

        self.TEAM_TRUSTED_CERT_CRT=['trusted.crt']


        self.CS_CERT_ORG=['Company']
        self.CS_CERT_ORG_UNIT=['Company Unit']


    def postload(self, **kwarg):

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

    def deploy(self):

        cert = f'{self.CS_NODE_FRONTEND_CERT_CRT_PATH[-1]}/{self.CS_NODE_FRONTEND_CERT_CRT_FILE[-1]}'
        rootCA = f'{self.CS_NODE_FRONTEND_CA_PATH[-1]}/{self.CS_NODE_FRONTEND_CA_FILE[-1]}'
        trusted = f'{self.TEAM_CONF_PATH}/trusted.crt'
        with open(cert, 'r') as fcert, open(rootCA, 'r') as frootCA:
            dump_cert = fcert.read()
            dump_rootCA = frootCA.read()
        self.logger.info(f'объединяю сертификаты {self.CS_NODE_FRONTEND_CERT_CRT_FILE[-1]} и {self.CS_NODE_FRONTEND_CA_FILE[-1]}')
        with open(trusted, 'w') as ftrusted:
            ftrusted.write(dump_cert.strip() + "\n" + dump_rootCA.strip() + "\n")
        self.logger.info(f'Готов сертифкат trusted.crt')
        
        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', '--project-name', 'team', '-f', f'{sys.path[0]}/team-compose.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'Настройки выполнены');
            pass
        else:
            return
        
    def get_requests(self, prefix_env: str = "CS", dialog: list = None, external:bool = False, **kwarg):
        dialogs = dialog if isinstance(dialog, list) else [
            {
                "env": ('CS_NODE_FRONTEND_CERT_CRT_PATH','CS_NODE_FRONTEND_CERT_CRT_FILE'),
                "default": f"{self.CS_NODE_FRONTEND_CERT_CRT_PATH[-1]}/{self.CS_NODE_FRONTEND_CERT_CRT_FILE[-1]}",
                "enable": None,
                "msg": (
                    f'Р7-Команда:\n\nВведите путь до файла SSL-сертификата',
                    f'Путь до файла сертификата обязателен к заполнению.',
                    f'Файл сертификата по указанному пути не найден.'
                ),
                "func_parse": self.parse_path_file(),
                "func_check": self.check_file(),
                "func_visibility": self.visibility_default(),
                "detalization": 1
            },
            {
                "env": ('CS_NODE_FRONTEND_CA_PATH','CS_NODE_FRONTEND_CA_FILE'),
                "default": f"{self.CS_NODE_FRONTEND_CA_PATH[-1]}/{self.CS_NODE_FRONTEND_CA_FILE[-1]}",
                "enable": None,
                "msg": (
                    f'Р7-Команда:\n\nВведите путь до корневого удостоверяющего SSL-сертификата',
                    f'Путь до файла сертификата обязателен к заполнению.',
                    f'Файл сертификата по указанному пути не найден.'
                ),
                "func_parse": self.parse_path_file(),
                "func_check": self.check_file(),
                "func_visibility": self.visibility_default(),
                "detalization": 1
            },
            {
                "env": "TEAM_CONF_PATH",
                "default": self.TEAM_CONF_PATH[-1],
                "enable": None,
                'msg': (
                    f'Р7-Команда:\n\nУкажите путь, где располжена конфигурация Р7-Команда (в старых версиях папка "config")',
                    f'Путь до директории обязателен к заполнению',
                    f'Указанный путь не найден'
                ),
                "func_parse": self.parse_path_dir(),
                "func_check": self.check_extended_dir(),
                "func_visibility": self.visibility_detalization(),
                "detalization": 1
            },
        ];
        self.get_dialogs(dialogs)
    
