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 string
import uuid
import configparser
import fileinput
from .docker_installer import Docker_installer
from .services import *


class Team_to_cs(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_team'
        self.BACK_MENU=[False]

### ENVIRONMENT GERENAL
        self.DETALIZATION = 1

### ENVIRONMENT TEAM
#env for rabbit
        self.dockercli = docker.from_env();
        self.PREFIX_MAIL=['mail']
        self.PREFIX_TEAM=['team']
        self.TEAM_FQDN=['team.domain.ru']
        self.MEDIA_FQDN=['media.domain.ru']
        self.CS_FQDN_ADMIN=['admin.domain.ru']
        self.CS_FQDN_DISK=['disk.domain.ru']
#        self.CS_CLIENT_ID=['id']
#        self.CS_CLIENT_SECRET=['secret']
        self.TEAM_INTEG_ENABLE=['true']
        self.TEAM_RABBIT_HOST=['192.168.0.2']
        self.TEAM_RABBIT_PORT=['5672']
        self.TEAM_RABBIT_USER=['team']
        self.TEAM_RABBIT_PWD=['team']
        self.TEAM_INTEG_HIDE=['true']
        self.CS_TEAM_CLIENT_ID=['']
        self.CS_TEAM_CLIENT_SECRET=['']
        self.CS_PAGES_CLIENT_ID=['']
        self.CS_PAGES_CLIENT_SECRET=['']
        self.CS_FORMS_CLIENT_ID=['']
        self.CS_FORMS_CLIENT_SECRET=['']

# #        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']        



        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_compose();
        self.build_configs();
        self.deploy();
        return self;

    def load_images(self, images: list = []):
        outputs=[];
        for image in images:
            with open(f'{sys.path[0]}/images/{image}', 'rb') as file:
                print(f'\nЗагружаю dump образов:\n{sys.path[0]}/images/{image}\n');
                try:
                    outputs = outputs + self.dockercli.images.load(file);
                except:
                    self.msgbox(f'Произошла ошибка при загрузке docker-образов из dump-файла {image}');

    def build_compose(self):
        self.logger.info(f'Открываю compose-файл team-compose.yaml на запись')

        with open('team-compose.yaml', 'r') as file:
            compose_data = yaml.safe_load(file)

#редактирование текстового файла построчно
        # try:
        #     with open('team-compose.yaml', 'r') as f:
        #         lines = f.readlines()

        #     lines[255] = '  disk-api:\n'
        #     lines[256] = '    image: downloads.r7-office.ru:9010/team/production/ubi18/disk-api:${VERSION:?error}-${BUILD:?error}\n'
        #     lines[257] = '    container_name: mgmt_disk-api\n'
        #     lines[258] = '    depends_on:\n'
        #     lines[259] = '      config-server:\n'
        #     lines[260] = '        condition: service_healthy\n'
        #     lines[261] = '    restart: unless-stopped\n'
        #     lines[262] = '    logging:\n'
        #     lines[263] = '      driver: "json-file"\n'
        #     lines[264] = '      options:\n'
        #     lines[265] = '        max-size: "10m"\n'
        #     lines[266] = '        max-file: "10"\n'
        #     lines[267] = '    healthcheck:\n'
        #     lines[268] = '      test: ["CMD", "curl", "-f", "http://127.0.0.1:9101/api/document/actuator/health"]\n'
        #     lines[269] = '      interval: 30s\n'
        #     lines[270] = '      timeout: 20s\n'
        #     lines[271] = '      retries: 3\n'

        #     with open('team-compose.yaml', 'w') as f:
        #         f.writelines(lines)

        # except FileNotFoundError:
        #     print(f"Ошибка: Файл не найден.")
        # except Exception as e:
        #     print(f"Произошла ошибка: {e}")
        
#редактирование файла как колекции        
#        if 'disk-api' not in compose_data['services']:
#            compose_data['services']['disk-api'] = []
            
        # disk_api_service = {
        #     'disk-api': {
        #         'image': 'downloads.r7-office.ru:9011/r7office/team/production/ubi18/disk-api:${VERSION:?error}-${BUILD:?error}',
        #         'container_name': 'mgmt_disk-api',
        #         'depends_on': {
        #             'config-server': {
        #                 'condition': 'service_healthy'
        #             }
        #         },
        #         'restart': 'unless-stopped',
        #         'logging': {
        #             'driver': 'json-file',
        #             'options': {
        #                 'max-size': '10m',
        #                 'max-file': '10'
        #             }
        #         },
        #         'healthcheck': {
        #             'test': ['CMD', 'curl', '-f', 'http://127.0.0.1:9101/api/document/actuator/health'],
        #             'interval': '30s',
        #             'timeout': '20s',
        #             'retries': 3
        #         }
        #     }
        # }    
        # compose_data['services'].update(disk_api_service)
        #    compose_data['services']['disk-api']['depends_on'] = []
                
        # compose_data['services']['disk-api']['image'] = 'downloads.r7-office.ru:9010/team/production/ubi18/disk-api:${TAG:?error}'
        # compose_data['services']['disk-api']['container_name'] = 'mgmt_disk-api'
        # compose_data['services']['disk-api']['depends_on']['config-server']['condition'] = 'service_healthy'
        # compose_data['services']['disk-api']['restart'] = 'unless-stopped'
        # compose_data['services']['disk-api']['logging']['driver'] = 'json-file'
        # compose_data['services']['disk-api']['logging']['options']['max-size'] = '10m'
        # compose_data['services']['disk-api']['logging']['options']['max-file'] = "10"
        # compose_data['services']['disk-api']['healthcheck']['test'] = ["CMD", "curl", "-f", "http://127.0.0.1:9101/api/document/actuator/health"]
        # compose_data['services']['disk-api']['healthcheck']['interval'] = '30s'
        # compose_data['services']['disk-api']['healthcheck']['timeout'] = '20s'
        # compose_data['services']['disk-api']['healthcheck']['retries'] = '3'
#        self.compose['services'] = self.components;
        
        self.logger.info(f'Открываю compose-файл template.yaml на запись')

        with open('team-compose.yaml', 'w') as file:
            self.logger.info(f'Выгружаю измененный после интеграции compose-файл team-compose.yaml')
            yaml.dump(compose_data, file, default_flow_style=False, sort_keys=False)

        print(f"Переменная окружения обновлена ")
        self.logger.info(f'Выгружаю compose-файл team-compose.yaml')

    def build_configs(self):
        # Открываем и считываем текущий конфиг
        with open(f'{self.INSTALL_CONF_PATH}/application.properties', 'r') as f:
            config_string = '[def]\n' + f.read()
        config = configparser.ConfigParser()
        config.read_string(config_string)
        config['def']['application.config.r7disk.base-url']=f'https://{self.CS_FQDN_ADMIN[-1]}'
        config['def']['application.config.r7disk.disk-url']=f'https://{self.CS_FQDN_DISK[-1]}'
        config['def']['application.config.r7disk.client-id']=f'{self.CS_TEAM_CLIENT_ID[-1]}'
        config['def']['application.config.r7disk.client-secret']=f'{self.CS_TEAM_CLIENT_SECRET[-1]}'
        config['def']['application.config.r7disk.queue-enabled']=f'{self.TEAM_INTEG_ENABLE[-1]}'
        config['def']['application.config.r7disk.queue-host']=f'{self.TEAM_RABBIT_HOST[-1]}'
        config['def']['application.config.r7disk.queue-port']=f'{self.TEAM_RABBIT_PORT[-1]}'
        config['def']['application.config.r7disk.queue-username']=f'{self.TEAM_RABBIT_USER[-1]}'
        config['def']['application.config.r7disk.queue-password']=f'{self.TEAM_RABBIT_PWD[-1]}'
        config['def']['application.config.ui.hide-internal-login']=f'{self.TEAM_INTEG_HIDE[-1]}'
        # Перезаписываем текущий конфиг добавив новые значения (строки с комментариями будут удалены)
        with open(f'{self.INSTALL_CONF_PATH}/application.properties','w') as f:
            for key, value in config['def'].items():
                f.write(f"{key}={value}\n")
    def deploy(self):
        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', '-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');
    
    def get_requests(self, dialog: list = None, external:bool = False, **kwarg):
        dialogs = dialog if isinstance(dialog, list) else [
            {
                "env": f'CS_FQDN_ADMIN',
                "enable": None,
                "msg": (
                    f'Настройка интеграции Р7-Команда -> Корпоративный сервер Р7:\n\nУкажите FQDN-имя Административной панели Корпоративного сервера Р7',
                    f'Имя FQDN обязательно к заполнению.',
                    f'Имя не может содержать спецсимволы, кроме "-"'
                ),
                "func_check": self.check_hostname(),
                "func_visibility": [self.visibility_detalization()],
                "detalization": 1
            },
            {
                "env": f'CS_FQDN_DISK',
                "enable": None,
                "msg": (
                    f'Настройка интеграции Р7-Команда -> Корпоративный сервер Р7:\n\nУкажите FQDN-имя Основной панели Корпоративного сервера Р7',
                    f'Имя FQDN обязательно к заполнению.',
                    f'Имя не может содержать спецсимволы, кроме "-"'
                ),
                "func_check": self.check_domain(),
                "func_visibility": [self.visibility_detalization()],
                "detalization": 1
            },
            {
                "env": f'CS_TEAM_CLIENT_ID',
                "enable": None,
                "msg": (
                    f'Настройка интеграции Р7-Команда -> Корпоративный сервер Р7:\n\nВведите client-id Корпоративного сервера Р7',
                    f'Номер порта обязателен к заполнению.',
                    f'Номер порта сервера должен состоять из чисел, буквы и спецсимволы не допустимы.'
                ),
                "func_check": self.check_default(),
                "func_visibility": self.visibility_detalization(),
                "detalization": 1
            },
            {
                "env": f'CS_TEAM_CLIENT_SECRET',
                "enable": None,
                "msg": (
                    f'Настройка интеграции Р7-Команда -> Корпоративный сервер Р7:\n\nВведите secret-id Корпоративного сервера Р7',
                    f'Номер порта обязателен к заполнению.',
                    f'Номер порта сервера должен состоять из чисел, буквы и спецсимволы не допустимы.'
                ),
                "func_check": self.check_default(),
                "func_visibility": self.visibility_detalization(),
                "detalization": 1
            },
            {
                "env": f'TEAM_RABBIT_HOST',
                "enable": None,
                "msg": (
                    f'Настройка интеграции Р7-Команда -> Корпоративный сервер Р7:\n\nВведите ip-адрес очереди RabbitMQ Корпоративного сервера Р7',
                    f'Номер порта обязателен к заполнению.',
                    f'Номер порта сервера должен состоять из чисел, буквы и спецсимволы не допустимы.'
                ),
                "func_check": self.check_hostname(),
                "func_visibility": self.visibility_detalization(),
                "detalization": 1
            },
            {
                "env": f'TEAM_RABBIT_PORT',
                "enable": None,
                "msg": (
                    f'Настройка интеграции Р7-Команда -> Корпоративный сервер Р7:\n\nВведите номер порта очереди RabbitMQ Корпоративного сервера Р7',
                    f'Номер порта обязателен к заполнению.',
                    f'Номер порта сервера должен состоять из чисел, буквы и спецсимволы не допустимы.'
                ),
                "func_check": self.check_port(),
                "func_visibility": self.visibility_detalization(),
                "detalization": 1
            },
#            {
#                "env": f'TEAM_RABBIT_USER',
#                "enable": None,
#                'msg': (
#                    f'Интеграция Р7 Команды -> Корпоративный сервер Р7:\n\nВведите имя пользователя RabbitMQ Корпоративного сервера Р7',
#                    f'Пароль пользователя {"внешнего " if external else ""}сервера RabbitMQ обязателен к заполнению.',
#                    f'Пароль не может быть пустым или содержать символы, отличные от A-z, 0-9 и символы "_", "-"'
#                ),
#                "func_check": self.check_user(),
#                "func_visibility": [self.visibility_detalization(), self.visibility_default()],
#                "detalization": 1
#            },
            {
                "env": f'TEAM_RABBIT_PWD',
                "enable": None,
                'msg': (
                    f'Настройка интеграции Р7-Команда -> Корпоративный сервер Р7:\n\nВведите пароль пользователя сервера RabbitMQ Корпоративного сервера Р7',
                    f'Пароль пользователя RabbitMQ обязателен к заполнению.',
                    f'Пароль не может быть пустым или содержать символы, отличные от A-z, 0-9 и символы "_", "-"'
                ),
                "func_check": self.check_pwd(),
                "func_visibility": [self.visibility_detalization(), self.visibility_default()],
                "detalization": 1
            },                        
#            {
#                "env": f'TEAM_INTEG_HIDE',
#                "enable": None,
#                "msg": (
#                    f'Установка Команды сервера управления:\n\nУкажите UUID медиа сервера',
#                    f'UUID обязателен к заполнению.',
#                    f'UUID не может содержать спецсимволы, кроме "-"'
#                ),
#                "func_check": self.check_default(),
#                "func_visibility": [self.visibility_detalization()],
#                "detalization": 1
#           },
        ];
        self.get_dialogs(dialogs)
