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
from .docker_installer import Docker_installer
from .services import *


class Int_CS_S3(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.GENERAL_NODE_LOGS_STORAGE=['./support_logs']

### ENVIRONMENT S3
#env for api and processing
        self.CS_STORAGE_S3_REGION=['region']
        self.CS_STORAGE_S3_ENDPOINT=['https://domain.cloud']
        self.CS_STORAGE_S3_BUCKET_NAME=['bucket-name']
        self.CS_STORAGE_S3_ACCESS_KEY_ID=['access_key']
        self.CS_STORAGE_S3_SECRET_ACCESS_KEY=['secret_key']

        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 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_configs(self):

        with open(f'{self.INSTALL_CONF_PATH}/api/appsettings.json', 'r', encoding='utf-8') as file:
            jfile = json.load(file)
        if "s3" not in jfile:
            jfile["s3"] = {}
        jfile["s3"]["key"] = self.CS_STORAGE_S3_ACCESS_KEY_ID[-1]
        jfile["s3"]["secret"] = self.CS_STORAGE_S3_SECRET_ACCESS_KEY[-1]
        jfile["s3"]["region"] = self.CS_STORAGE_S3_REGION[-1]
        jfile["s3"]["bucket"] = self.CS_STORAGE_S3_BUCKET_NAME[-1]
        jfile["s3"]["url"] = self.CS_STORAGE_S3_ENDPOINT[-1]

        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)

        with open(f'{self.INSTALL_CONF_PATH}/processing/appsettings.json', 'r', encoding='utf-8') as file:
            jfile = json.load(file)
        if "s3" not in jfile:
            jfile["s3"] = {}
        jfile["s3"]["key"] = self.CS_STORAGE_S3_ACCESS_KEY_ID[-1]
        jfile["s3"]["secret"] = self.CS_STORAGE_S3_SECRET_ACCESS_KEY[-1]
        jfile["s3"]["region"] = self.CS_STORAGE_S3_REGION[-1]
        jfile["s3"]["bucket"] = self.CS_STORAGE_S3_BUCKET_NAME[-1]
        jfile["s3"]["url"] = self.CS_STORAGE_S3_ENDPOINT[-1]


        with open(f'{self.INSTALL_CONF_PATH}/processing/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'Настройки интеграции Корпоративного сервера 2024 с S3 выполнены');
            pass
        else:
            return
    def get_requests(self, dialog: list = None, external:bool = False, **kwarg):
        dialogs = dialog if isinstance(dialog, list) else [
            {
                "env": f'CS_STORAGE_S3_REGION',
                "enable": None,
                "msg": (
                    f'Интеграция S3 хранилища c Корпоративным сервером 2024:\n\nУкажите Region S3',
                    f'Region обязательно к заполнению.',
#                    f'Имя не может содержать спецсимволы, кроме "-"'
                ),
                "func_check": self.check_default(),
                "func_visibility": [self.visibility_detalization()],
                "detalization": 1
            },
            {
                "env": f'CS_STORAGE_S3_BUCKET_NAME',
                "enable": None,
                "msg": (
                    f'Интеграция S3 хранилища c Корпоративным сервером 2024:\n\nУкажите Bucket S3',
                    f'Bucket обязательно к заполнению.',
#                    f'Имя не может содержать спецсимволы, кроме "-"'
                ),
                "func_check": self.check_default(),
                "func_visibility": [self.visibility_detalization()],
                "detalization": 1
            },
            {
                "env": f'CS_STORAGE_S3_ENDPOINT',
                "enable": None,
                "msg": (
                    f'Интеграция S3 хранилища c Корпоративным сервером 2024:\n\nУкажите ENDPOINT S3',
                    f'Bucket обязательно к заполнению.',
#                    f'Имя не может содержать спецсимволы, кроме "-"'
                ),
                "func_check": self.check_default(),
                "func_visibility": [self.visibility_detalization()],
                "detalization": 1
            },
            {
                "env": f'CS_STORAGE_S3_ACCESS_KEY_ID',
                "enable": None,
                "msg": (
                    f'Интеграция S3 хранилища c Корпоративным сервером 2024:\n\nУкажите Access key S3',
                    f'Bucket обязательно к заполнению.',
#                    f'Имя не может содержать спецсимволы, кроме "-"'
                ),
                "func_check": self.check_default(),
                "func_visibility": [self.visibility_detalization()],
                "detalization": 1
            },
            {
                "env": f'CS_STORAGE_S3_SECRET_ACCESS_KEY',
                "enable": None,
                "msg": (
                    f'Интеграция S3 хранилища c Корпоративным сервером 2024:\n\nУкажите Secret key S3',
                    f'Bucket обязательно к заполнению.',
#                    f'Имя не может содержать спецсимволы, кроме "-"'
                ),
                "func_check": self.check_default(),
                "func_visibility": [self.visibility_detalization()],
                "detalization": 1
            },
        ];
        self.get_dialogs(dialogs)
