import os

from .base_service import Base_service

class mail_postgres(Base_service):
    def go(self, **kwarg):
        self.get_requests_generic();
        self.async_runner(tasks=[self.load_images_async, self.get_requests], images=['mail-psql.img'], **kwarg)
#        self.get_requests(**kwarg);
        self.add_service();

    async def get_requests(self, dialog: list = None, external:bool = False, **kwarg):
        dialogs = dialog if isinstance(dialog, list) else [
            {
                "env": f'MAIL_PSQL_HOST',
                "enable": None,
                "msg": (
                    f'Р7-Почтовый сервер:\n\nВведите адрес {"внешнего " if external else ""} сервера PostgreSQL',
                    f'Адрес {"внешнего " if external else ""}сервера PostgreSQL обязателен к заполнению.',
                    f'Адрес {"внешнего " if external else ""}сервера PostgreSQL не может содержать спецсимволы, кроме "-" и "."'
                ),
                "func_check": self.check_hostname(),
                "func_visibility": self.visibility_detalization(),
                "detalization": 3
            },
            {
                "env": f'MAIL_PSQL_PORT',
                "enable": None,
                "msg": (
                    f'Р7-Почтовый сервер:\n\nВведите номер порта {"внешнего " if external else ""}сервера PostgreSQL',
                    f'Номер порта {"внешнего " if external else ""}сервера PostgreSQL обязателен к заполнению.',
                    f'Номер порта {"внешнего " if external else ""}сервера PostgreSQL должен состоять из чисел, буквы и спецсимволы не допустимы.'
                ),
                "func_check": self.check_port(),
                "func_visibility": self.visibility_detalization(),
                "detalization": 3
            },
            {
                "env": f'MAIL_PSQL_DB',
                "enable": None,
                'msg': (
                    f'Р7-Почтовый сервер:\n\nВведите имя базы данных {"внешнего " if external else ""}сервера PostgreSQL',
                    f'Имя базы данных {"внешнего " if external else ""}сервера PostgreSQL обязательно к заполнению.',
                    f'Имя базы данных {"внешнего " if external else ""}сервера PostgreSQL не может содержать спецсимволы, кроме "-" и "_"'
                ),
                "func_check": self.check_db(),
                "func_visibility": self.visibility_detalization(),
                "detalization": 2
            },
            {
                "env": f'MAIL_PSQL_USER',
                "enable": None,
                'msg': (
                    f'Р7-Почтовый сервер:\n\nВведите имя пользователя {"внешнего " if external else ""}сервера PostgreSQL',
                    f'Имя пользователя {"внешнего " if external else ""}сервера PostgreSQL обязателен к заполнению.',
                    None
#                    f'Имя пользователя {"внешнего " if external else ""}сервера PostgreSQL не может содержать спецсимволы, кроме "-" и "_"'
                ),
                "func_check": self.check_user(),
                "func_visibility": self.visibility_detalization(),
                "detalization": 2
            },
            {
                "env": f'MAIL_PSQL_PWD',
                "enable": None,
                'msg': (
                    f'Р7-Почтовый сервер:\n\nВведите пароль пользователя {"внешнего " if external else ""}сервера PostgreSQL',
                    f'Пароль пользователя {"внешнего " if external else ""}сервера PostgreSQL обязателен к заполнению.',
                    f'Пароль не может быть пустым'
                ),
                "func_check": self.check_pwd(),
                "func_visibility": self.visibility_detalization(),
                "detalization": 1
            },
            {
                "env": f'MAIL_NODE_PSQL_STORAGE',
                "enable": None,
                'msg': (
                    f'Р7-Почтовый сервер:\n\nВведите путь до директории хранения БД сервера PostgreSQL',
                    f'Путь до директории хранения БД обязателен к заполнению',
                    f'Указанный путь не найден'
                ),
                "func_parse": self.parse_path_dir(),
                "func_check": self.check_extended_dir(),
                "func_visibility": self.visibility_detalization(),
                "detalization": 2
            },
            {
                "env": ('MAIL_MTA_HOST','MAIL_DOMAIN'),
                "default": f"{self.MAIL_MTA_HOST[0]}.{self.MAIL_DOMAIN[0]}",
                "enable": None,
                "msg": (
                    f'Р7-Почтовый сервер:\n\nВведите FQDN-имя почтового сервера',
                    f'Имя обязательно к заполнению.',
                    f'FQDN-имена не могут содержать спецсимволы, кроме "-" и "."'
                ),
                "func_parse": self.parse_fqdn(),
                "func_check": self.check_fqdn(),
                "func_visibility": self.visibility_detalization(),
                "detalization": 1
            },
        ];
        self.get_dialogs(dialogs)

#        for request in dialogs:
#            if request["enable"]:
#                self.get_request(
#                    env_name = request["env"],
#                    msg = request['msg'],
#                    func_check = request["func_check"],
#                    password = request["env"].endswith("_PWD")
#                );
#            else:
#                if len(getattr(self, request["env"])) != 2: getattr(self, request["env"]).append(getattr(self, request["env"])[0]);

    def add_service(self):
        self.env_is_default([
            'MAIL_PSQL_IMAGE_NAME',
            'MAIL_PSQL_IMAGE_VERSION',
            'MAIL_PSQL_CONTAINER_NAME',
            'MAIL_PSQL_HOST',
            'MAIL_DOMAIN',
            'MAIL_PSQL_DB',
            'MAIL_PSQL_USER',
            'MAIL_PSQL_PWD',
            'MAIL_PSQL_PORT'
        ]);

        self.service = {self.__class__.__name__.replace('_','-'): {
                'environment':{
                    'MAIL_PSQL_HOST': self.MAIL_PSQL_HOST[-1],
                    'MAIL_DOMAIN': self.MAIL_DOMAIN[-1],
                    'POSTGRES_DB': self.MAIL_PSQL_DB[-1],
                    'POSTGRES_USER': self.MAIL_PSQL_USER[-1],
                    'PGSQL_PASSWORD': self.MAIL_PSQL_PWD[-1],
                    'POSTGRES_PASSWORD': self.MAIL_PSQL_PWD[-1],
                    'PGPORT': self.MAIL_PSQL_PORT[-1]
                },
                'volumes':[
                    {'type': 'bind', 'source': f'{self.MAIL_NODE_PSQL_STORAGE[-1]}', 'target': '/var/lib/postgresql/data/'},
                    {'type': 'bind', 'source': f'./configs/log/mail', 'target': '/var/log/postgresql/'}
                ],
                'networks': [f'net-{self.PREFIX_MAIL[0]}'],
#                'ports':[
#                    {'target': self.MAIL_PSQL_PORT[-1],
#                    'published': 5434,
#                    'protocol': 'tcp',
#                    'mode': 'host'},
#                ],
                'image': f'{self.MAIL_PSQL_IMAGE_NAME[-1]}:{self.MAIL_PSQL_IMAGE_VERSION[-1]}',
#                'image': 'downloads.r7-office.ru:9011/r7office/mail-psql:1.0.35-swarm',
                'hostname': self.MAIL_PSQL_HOST[-1],
                'container_name': self.MAIL_PSQL_CONTAINER_NAME[-1],
#                'read_only': True,
                'shm_size': '128mb',
                'restart': 'unless-stopped'
            }
        };

