from .base_service import Base_service
import sys
class media_nginx(Base_service):

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

    async def get_requests(self, prefix_env: str = "MEDIA", dialog: list = None, external:bool = False, **kwarg):
        dialogs = dialog if isinstance(dialog, list) else [
            {
                "env": '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": ('MEDIA_CERT_CRT_PATH','MEDIA_CERT_CRT_FILE'),
                "default": f"{self.MEDIA_CERT_CRT_PATH[0]}/{self.MEDIA_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": ('MEDIA_CERT_KEY_PATH','MEDIA_CERT_KEY_FILE'),
                "default": f"{self.MEDIA_CERT_KEY_PATH[0]}/{self.MEDIA_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": '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": '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": 'MEDIA_NGINX_HOST',
                "enable": None,
                "msg": (
                    f'Установка Р7-Команда медиа сервера:\n\nВведите адрес {"внешнего " if external else ""}сервера nginx',
                    f'Адрес {"внешнего " if external else ""}сервера nginx обязателен к заполнению.',
                    f'Адрес {"внешнего " if external else ""}сервера nginx не может содержать спецсимволы, кроме "-" и "."'
                ),
                "func_check": self.check_hostname(),
                "func_visibility": self.visibility_detalization(),
                "detalization": 3
            },
            {
                "env": 'MEDIA_NGINX_PORT',
                "enable": None,
                "msg": (
                    f'Установка Р7-Команда медиа сервера:\n\nВведите номер открытого порта {"внешнего " if external else ""}сервера nginx',
                    f'Номер порта {"внешнего " if external else ""}сервера nginx обязателен к заполнению.',
                    f'Номер порта {"внешнего " if external else ""}сервера nginx должен состоять из чисел, буквы и спецсимволы не допустимы.'
                ),
                "func_check": self.check_port(),
                "func_visibility": self.visibility_detalization(),
                "detalization": 4
            },
            {
                "env": ('MEDIA_NGINX_IMAGE_NAME','MEDIA_NGINX_IMAGE_VERSION'),
                "enable": None,
                "msg": (
                    f'Установка Р7-Команда медиа сервера:\n\nВведите имя docker-образа в формате image:tag для сервера nginx',
                    f'Имя обязательно к заполнению.',
                    f'Имя docker-образа не может содержать спецсимволы, кроме "-", "." и ":"'
                ),
                "func_parse": self.parse_image_tag(),
                "func_check": self.check_image_tag(),
                "func_visibility": self.visibility_detalization(),
                "detalization": 6
            },
        ];
        self.get_dialogs(dialogs)


    def add_service(self):
        self.service = {self.__class__.__name__.replace('media_',''): {
            'networks': ['external','internal'],
            'image': f'{self.MEDIA_NGINX_IMAGE_NAME[-1]}:{self.MEDIA_NGINX_IMAGE_VERSION[-1]}',
            'container_name': self.MEDIA_NGINX_CONTAINER_NAME[-1],
            'hostname': self.MEDIA_NGINX_HOST[-1],
            'depends_on': ['redis','media'],
            'ports':[
                {'target': 80,
                'published': self.MEDIA_HTTP_PUBLISH_PORT[-1],
                'protocol': 'tcp',
                'mode': 'host'},
                {'target': 443,
                'published': self.MEDIA_HTTPS_PUBLISH_PORT[-1],
                'protocol': 'tcp',
                'mode': 'host'}
            ],
            'volumes':[
                {'type': 'bind', 'source': f'{self.INSTALL_CONF_PATH}/dhparam.pem', 'target': '/etc/ssl/dhparam.pem'},
                {'type': 'bind', 'source': f'{self.INSTALL_CONF_PATH}/application.conf', 'target': '/etc/gate/gate.conf.d/applications.conf'},
                {'type': 'bind', 'source': f'{self.INSTALL_CONF_PATH}/gate.ssl', 'target': '/etc/nginx/snippets/gate.ssl'},
                {'type': 'bind', 'read_only': True, 'source': f'{self.MEDIA_CERT_CRT_PATH[-1]}/{self.MEDIA_CERT_CRT_FILE[-1]}', 'target': f'/etc/ssl/private/ssl-certificate.pem'},
                {'type': 'bind', 'read_only': True, 'source': f'{self.MEDIA_CERT_KEY_PATH[-1]}/{self.MEDIA_CERT_KEY_FILE[-1]}', 'target': f'/etc/ssl/private/ssl-certificate-key.pem'},
            ],                
            'restart': 'always',
            'logging': {
                'driver': 'json-file',
                'options': {'max-file':'5',
                            'max-size': '10m'},
            }                
        }
    };
