from .base_service import Base_service

class mgmt_config_server(Base_service):

    def go(self, **kwarg):
        self.async_runner(tasks=[self.load_images_async, self.get_requests], images=['config-server.img'], **kwarg)
#        self.get_requests(**kwarg);
        self.add_service();

    async def get_requests(self, prefix_env: str = "MGMT", dialog: list = None, external:bool = False, **kwarg):
        dialogs = dialog if isinstance(dialog, list) else [
            {
                "env": f'{prefix_env}_CONFIG_SERVER_HOST',
                "enable": None,
                "msg": (
                    f'Установка Р7-Команда сервер управления:\n\nВведите адрес {"внешнего " if external else ""}сервера config-server',
                    f'Адрес {"внешнего " if external else ""}сервера config-server обязателен к заполнению.',
                    f'Адрес {"внешнего " if external else ""}сервера config-server не может содержать спецсимволы, кроме "-" и "."'
                ),
                "func_check": self.check_hostname(),
                "func_visibility": self.visibility_detalization(),
                "detalization": 3
            },
            {
                "env": f'{prefix_env}_CONFIG_SERVER_PORT',
                "enable": None,
                "msg": (
                    f'Установка Р7-Команда сервер управления:\n\nВведите номер открытого порта {"внешнего " if external else ""}сервера config-server',
                    f'Номер порта {"внешнего " if external else ""}сервера config-server обязателен к заполнению.',
                    f'Номер порта {"внешнего " if external else ""}сервера config-server должен состоять из чисел, буквы и спецсимволы не допустимы.'
                ),
                "func_check": self.check_port(),
                "func_visibility": self.visibility_detalization(),
                "detalization": 4
            },            {
                "env": (f'{prefix_env}_CONFIG_SERVER_IMAGE_NAME',f'{prefix_env}_CONFIG_SERVER_IMAGE_VERSION'),
                "enable": None,
                "msg": (
                    f'Установка Р7-Команда сервер управления:\n\nВведите имя docker-образа в формате image:tag для сервера config-server',
                    f'Имя обязательно к заполнению.',
                    f'Имя docker-образа не может содержать спецсимволы, кроме "-", "." и ":"'
                ),
                "func_parse": self.parse_image_tag(),
                "func_check": self.check_image_tag(),
                "func_visibility": self.visibility_detalization(),
                "detalization": 6
            },
            {
                "env": f'TEAM_FQDN',
                "enable": None,
                "msg": (
                    f'Установка Р7-Команда сервер управления:\n\nУкажите FQDN-имя для сервера управления',
                    f'Имя FQDN обязательно к заполнению.',
                    f'Имя не может содержать спецсимволы, кроме "-"'
                ),
                "func_check": self.check_hostname(),
                "func_visibility": [self.visibility_detalization()],
                "detalization": 1
            },
            {
                "env": f'TEAM_HTTPS_PUBLISH_PORT',
                "enable": None,
                "msg": (
                    f'Установка Р7-Команда сервер управления:\n\nВведите номер HTTPS порта сервера управления',
                    f'Номер порта обязателен к заполнению.',
                    f'Номер порта сервера должен состоять из чисел, буквы и спецсимволы не допустимы.'
                ),
                "func_check": self.check_port(),
                "func_visibility": self.visibility_detalization(),
                "detalization": 1
            },
            {
                "env": f'TEAM_HTTP_PUBLISH_PORT',
                "enable": None,
                "msg": (
                    f'Установка Р7-Команда сервер управления:\n\nВведите номер HTTP порта сервера управления',
                    f'Номер порта обязателен к заполнению.',
                    f'Номер порта сервера должен состоять из чисел, буквы и спецсимволы не допустимы.'
                ),
                "func_check": self.check_port(),
                "func_visibility": self.visibility_detalization(),
                "detalization": 1
            },            
            {
                "env": ('TEAM_CERT_CRT_PATH','TEAM_CERT_CRT_FILE'),
                "default": f"{self.TEAM_CERT_CRT_PATH[0]}/{self.TEAM_CERT_CRT_FILE[0]}",
                "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_CERT_KEY_PATH','TEAM_CERT_KEY_FILE'),
                "default": f"{self.TEAM_CERT_KEY_PATH[0]}/{self.TEAM_CERT_KEY_FILE[0]}",
                "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": f'MEDIA_FQDN',
                "enable": None,
                "msg": (
                    f'Установка Р7-Команда сервер управления:\n\nУкажите FQDN-имя для медиа сервера',
                    f'Имя FQDN обязательно к заполнению.',
                    f'Имя не может содержать спецсимволы, кроме "-"'
                ),
                "func_check": self.check_hostname(),
                "func_visibility": [self.visibility_detalization()],
                "detalization": 1
            },            
            {
                "env": f'MEDIA_HTTPS_PUBLISH_PORT',
                "enable": None,
                "msg": (
                    f'Установка Р7-Команда сервер управления:\n\nВведите номер внешнего HTTPS порта вашего медиа сервера',
                    f'Номер порта обязателен к заполнению.',
                    f'Номер порта сервера должен состоять из чисел, буквы и спецсимволы не допустимы.'
                ),
                "func_check": self.check_port(),
                "func_visibility": self.visibility_detalization(),
                "detalization": 1
            },
            {
                "env": f'MEDIA_HTTP_PUBLISH_PORT',
                "enable": None,
                "msg": (
                    f'Установка Р7-Команда сервер управления:\n\nВведите номер внешнего HTTP порта вашего медиа сервера',
                    f'Номер порта обязателен к заполнению.',
                    f'Номер порта сервера должен состоять из чисел, буквы и спецсимволы не допустимы.'
                ),
                "func_check": self.check_port(),
                "func_visibility": self.visibility_detalization(),
                "detalization": 1
            },            
            {
                "env": f'TEAM_UUID',
                "enable": None,
                "msg": (
                    f'Установка Р7-Команда сервер управления:\n\nУкажите UUID медиа сервера',
                    f'UUID обязателен к заполнению.',
                    f'UUID не может содержать спецсимволы, кроме "-"'
                ),
                "func_check": self. check_default(),
                "func_visibility": [self.visibility_detalization()],
                "detalization": 1
            },
            {
                "env": f'TEAM_TOKEN',
                "enable": None,
                "msg": (
                    f'Установка Р7-Команда сервер управления:\n\nУкажите TOKEN медиа сервера',
                    f'TOKEN обязателен к заполнению.',
                    f'TOKEN не может содержать спецсимволы, кроме "-"'
                ),
                "func_check": self.check_default(),
                "func_visibility": [self.visibility_detalization()],
                "detalization": 1
            },
        ];
        self.get_dialogs(dialogs)


    def add_service(self):
        self.service = {self.__class__.__name__.replace('mgmt_config_','config-'): {
            'image': f'{self.MGMT_CONFIG_SERVER_IMAGE_NAME[-1]}:{self.MGMT_CONFIG_SERVER_IMAGE_VERSION[-1]}',
            'container_name': self.MGMT_CONFIG_SERVER_CONTAINER_NAME[-1],
            # 'hostname': self.MGMT_CONFIG_SERVER_HOST[-1],
            "environment": {
                "OAUTH2_AUTHORIZED_REDIRECT_URIS": f"https://{self.TEAM_FQDN[-1]}:{self.TEAM_HTTPS_PUBLISH_PORT[-1]}, r7team://redirect, r7-team://redirect",
                "OAUTH2_REDIRECT_BASE_URL": f"https://{self.TEAM_FQDN[-1]}:{self.TEAM_HTTPS_PUBLISH_PORT[-1]}/uaa"
            },
            "volumes":[f"{self.INSTALL_CONF_PATH}:/opt/team/",f"{self.TEAM_CERT_CRT_PATH[-1]}/{self.TEAM_CERT_CRT_FILE[-1]}:/opt/team/domain.crt",f"{self.TEAM_CERT_KEY_PATH[-1]}/{self.TEAM_CERT_KEY_FILE[-1]}:/opt/team/domain.key"],                
            "healthcheck": {
                "test": ["CMD", "curl", "-f", "http://127.0.0.1:8761/actuator/health"],
                "interval": "30s",
                "timeout": "20s",
                "retries": 3
            },
            'restart': 'unless-stopped',
            'logging': {
                'driver': 'json-file',
                'options': {'max-file':'10',
                            'max-size': '10m'},
            }                
        }
    };
