import sys

from .base_service import Base_service
from .cs_api import cs_api
from .cs_ssoapi import cs_ssoapi
from .cs_draw import cs_draw

class cs_frontend(Base_service):

    def go(self, **kwarg):
        if 'cs-api' not in self.select_components: self.get_external_class(cs_api)
        if 'cs-ssoapi' not in self.select_components: self.get_external_class(cs_ssoapi)
        if 'cs-draw' not in self.select_components: self.get_external_class(cs_draw)        
        self.get_requests_generic();
        self.async_runner(tasks=[self.load_images_async, self.get_requests], images=['cddisk-frontend.img'], **kwarg)
#        self.get_requests(**kwarg);
        self.add_service();

    async def get_requests(self, dialog: dict = None, external:bool = False, **kwarg):
        dialogs = dialog if isinstance(dialog, list) else [
            {
                "env": f'CS_FRONTEND_PREFIX_CDDISK',
                "enable": None,
                "msg": (
                    f'Р7-Корпоративный сервер:\n\nВведите префикс для FQDN-имени сайта "Р7-Диск"',
                    f'Префикс имени сайта обязателен к заполнению.',
                    f'Префикс не может содержать спецсимволы, кроме "-"'
                ),
                "func_check": self.check_hostname(),
                "func_visibility": [self.visibility_detalization()],
                "detalization": 2
            },
            {
                "env": f'CS_FRONTEND_PREFIX_ADMIN',
                "enable": None,
                "msg": (
                    f'Р7-Корпоративный сервер:\n\nВведите префикс для FQDN-имени сайта "Р7-Панель управления"',
                    f'Префикс имени сайта обязателен к заполнению.',
                    f'Префикс не может содержать спецсимволы, кроме "-"'
                ),
                "func_check": self.check_hostname(),
                "func_visibility": [self.visibility_detalization()],
                "detalization": 2
            },
            {
                "env": f'CS_FRONTEND_PREFIX_CDMAIL',
                "enable": None,
                "msg": (
                    f'Р7-Корпоративный сервер:\n\nВведите префикс для FQDN-имени сайта "Р7-Почта"',
                    f'Префикс имени сайта обязателен к заполнению.',
                    f'Префикс не может содержать спецсимволы, кроме "-"'
                ),
                "func_check": self.check_hostname(),
                "func_visibility": [self.visibility_detalization()],
                "detalization": 2
            },
            {
                "env": f'CS_FRONTEND_PREFIX_CONTACTS',
                "enable": None,
                "msg": (
                    f'Р7-Корпоративный сервер:\n\nВведите префикс для FQDN-имени сайта "Р7-Контакты"',
                    f'Префикс имени сайта обязателен к заполнению.',
                    f'Префикс не может содержать спецсимволы, кроме "-"'
                ),
                "func_check": self.check_hostname(),
                "func_visibility": [self.visibility_detalization()],
                "detalization": 2
            },
            {
                "env": f'CS_FRONTEND_PREFIX_CALENDAR',
                "enable": None,
                "msg": (
                    f'Р7-Корпоративный сервер:\n\nВведите префикс для FQDN-имени сайта "Р7-Календарь"',
                    f'Префикс имени сайта обязателен к заполнению.',
                    f'Префикс не может содержать спецсимволы, кроме "-"'
                ),
                "func_check": self.check_hostname(),
                "func_visibility": [self.visibility_detalization()],
                "detalization": 2
            },
            {
                "env": f'CS_FRONTEND_PREFIX_PROJECTS',
                "enable": None,
                "msg": (
                    f'Р7-Корпоративный сервер:\n\nВведите префикс для FQDN-имени сайта "Р7-Проекты"',
                    f'Префикс имени сайта обязателен к заполнению.',
                    f'Префикс не может содержать спецсимволы, кроме "-"'
                ),
                "func_check": self.check_hostname(),
                "func_visibility": [self.visibility_detalization()],
                "detalization": 2
            },
            {
                "env": f'CS_FRONTEND_PREFIX_DRAW',
                "enable": None,
                "msg": (
                    f'Р7-Корпоративный сервер:\n\nВведите префикс для FQDN-имени сайта "Р7-Графика"',
                    f'Префикс имени сайта обязателен к заполнению.',
                    f'Префикс не может содержать спецсимволы, кроме "-"'
                ),
                "func_check": self.check_hostname(),
                "func_visibility": [self.visibility_detalization()],
                "detalization": 2
            },
            {
                "env": ('CS_NODE_FRONTEND_CERT_CRT_PATH','CS_NODE_FRONTEND_CERT_CRT_FILE'),
                "default": f"{self.CS_NODE_FRONTEND_CERT_CRT_PATH[0]}/{self.CS_NODE_FRONTEND_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": ('CS_NODE_FRONTEND_CERT_KEY_PATH','CS_NODE_FRONTEND_CERT_KEY_FILE'),
                "default": f"{self.CS_NODE_FRONTEND_CERT_KEY_PATH[0]}/{self.CS_NODE_FRONTEND_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'CS_FRONTEND_HOST',
                "enable": None,
                "msg": (
                    f'Р7-Корпоративный сервер:\n\nВведите сетевое имя службы CS-Frontend',
                    f'Сетевое имя службы CS-Frontend обязательно к заполнению.',
                    f'Сетевое имя не может содержать спецсимволы, кроме "-"'
                ),
                "func_check": self.check_hostname(),
                "func_visibility": [self.visibility_detalization()],
                "detalization": 3
            },
            {
                "env": f'CS_FRONTEND_HTTPS_PORT',
                "enable": None,
                "msg": (
                    f'Р7-Корпоративный сервер:\n\nВведите номер открытого HTTPS порта {"внешней " if external else ""}службы CS-Frontend',
                    f'Номер порта {"внешней " if external else ""}службы CS-Frontend обязателен к заполнению.',
                    f'Номер порта {"внешней " if external else ""}службы CS-Frontend должен состоять из чисел, буквы и спецсимволы не допустимы.'
                ),
                "func_check": self.check_port(),
                "func_visibility": self.visibility_detalization(),
                "detalization": 5
            },
            {
                "env": f'CS_FRONTEND_HTTP_PORT',
                "enable": None,
                "msg": (
                    f'Р7-Корпоративный сервер:\n\nВведите номер открытого HTTP порта {"внешней " if external else ""}службы CS-Frontend',
                    f'Номер порта {"внешней " if external else ""}службы CS-Frontend обязателен к заполнению.',
                    f'Номер порта {"внешней " if external else ""}службы CS-Frontend должен состоять из чисел, буквы и спецсимволы не допустимы.'
                ),
                "func_check": self.check_port(),
                "func_visibility": self.visibility_detalization(),
                "detalization": 5
            },                        
            {
                "env": f'CS_FRONTEND_CONTAINER_NAME',
                "enable": None,
                "msg": (
                    f'Р7-Корпоративный сервер:\n\nВведите имя контейнера службы CS-Frontend',
                    f'Имя контейнера обязательно к заполнению.',
                    f'Имя контейнера не может содержать спецсимволы, кроме "-"'
                ),
                "func_check": self.check_hostname(),
                "func_visibility": [self.visibility_detalization()],
                "detalization": 6
            },
        ];
        self.get_dialogs(dialogs)

    def add_service(self):
        self.env_is_default([
            'CS_FRONTEND_CONTAINER_NAME',
            'CS_FRONTEND_IMAGE_NAME',
            'CS_FRONTEND_IMAGE_VERSION',
            'CS_FRONTEND_DOMAIN',
            'CS_FRONTEND_HOST',
#            'CS_FRONTEND_HTTP_PORT',
#            'CS_FRONTEND_HTTPS_PORT',
            'CS_FRONTEND_CERT_PATH',
            'CS_NODE_FRONTEND_CERT_CRT_PATH',
            'CS_NODE_FRONTEND_CERT_CRT_FILE',
            'CS_NODE_FRONTEND_CERT_KEY_PATH',
            'CS_NODE_FRONTEND_CERT_KEY_FILE',
            'CS_FRONTEND_CERT_PATH',
            'CS_FRONTEND_CERT_CRT_FILE',
            'CS_FRONTEND_CERT_KEY_FILE'
        ]);
        self.service = {self.__class__.__name__.replace('_','-'): {
                'environment':{
                    'r7_SITE_DOMAIN': self.CS_FRONTEND_DOMAIN[-1],
                    'r7_PAGES_DOMAIN': f'{self.CS_FRONTEND_PREFIX_PAGES[-1]}.{self.CS_FRONTEND_DOMAIN[-1]}', #:{self.CS_FRONTEND_HTTPS_PORT[-1]}',
                    'r7_FORMS_DOMAIN': f'{self.CS_FRONTEND_PREFIX_FORMS[-1]}.{self.CS_FRONTEND_DOMAIN[-1]}', #:{self.CS_FRONTEND_HTTPS_PORT[-1]}',
                    'r7_PAGES_URL': f'{self.CS_FRONTEND_SCHEME[-1]}://{self.CS_FRONTEND_PREFIX_PAGES[-1]}.{self.CS_FRONTEND_DOMAIN[-1]}:{self.CS_FRONTEND_HTTPS_PORT[-1]}',
                    'r7_FORMS_URL': f'{self.CS_FRONTEND_SCHEME[-1]}://{self.CS_FRONTEND_PREFIX_FORMS[-1]}.{self.CS_FRONTEND_DOMAIN[-1]}:{self.CS_FRONTEND_HTTPS_PORT[-1]}',
                },
                'volumes':[
#                    {'type': 'bind', 'read_only': True, 'source': f'{self.CS_NODE_FRONTEND_CERT_CRT_PATH[-1]}/{self.CS_NODE_FRONTEND_CERT_CRT_FILE[-1]}', 'target': f'{self.CS_FRONTEND_CERT_PATH[-1]}/{self.CS_FRONTEND_CERT_CRT_FILE[-1]}'},
#                    {'type': 'bind', 'read_only': True, 'source': f'{self.CS_NODE_FRONTEND_CERT_KEY_PATH[-1]}/{self.CS_NODE_FRONTEND_CERT_KEY_FILE[-1]}', 'target': f'{self.CS_FRONTEND_CERT_PATH[-1]}/{self.CS_FRONTEND_CERT_KEY_FILE[-1]}'},
                    {'type': 'bind', 'read_only': True, 'source': f'{self.CS_NODE_FRONTEND_CERT_CRT_PATH[-1]}/{self.CS_NODE_FRONTEND_CERT_CRT_FILE[-1]}', 'target': f'/etc/nginx/ssl/fullchain.crt'},
                    {'type': 'bind', 'read_only': True, 'source': f'{self.CS_NODE_FRONTEND_CERT_KEY_PATH[-1]}/{self.CS_NODE_FRONTEND_CERT_KEY_FILE[-1]}', 'target': f'/etc/nginx/ssl/privkey.key'},
                    {'type': 'bind', 'source': f'{sys.path[0]}/configs/ssl/ssl.conf', 'target': '/etc/nginx/ssl/ssl.conf'},
                    {'type': 'bind', 'source': f'{sys.path[0]}/configs/frontend/nginx', 'target': '/etc/nginx/conf.d/'}
                ],
                'networks': [f'net-{self.PREFIX_CS[0]}'],
                'ports':[
                    {'target': 80,
                    'published': self.CS_FRONTEND_HTTP_PORT[-1],
                    'protocol': 'tcp',
                    'mode': 'host'},
                    {'target': 443,
                    'published': self.CS_FRONTEND_HTTPS_PORT[-1],
                    'protocol': 'tcp',
                    'mode': 'host'}
                ],
                'image': f'{self.CS_FRONTEND_IMAGE_NAME[-1]}:{self.CS_FRONTEND_IMAGE_VERSION[-1]}',
                'hostname': self.CS_FRONTEND_HOST[-1],
                'container_name': self.CS_FRONTEND_CONTAINER_NAME[-1],
                'restart': 'unless-stopped',
#                'command': 'nginx -g "daemon off;"'
                'depends_on': ['cs-draw','cs-api']
            }
        };
#        print(self.service)
