import os
#from ...dns import *
from .base_service import Base_service
#from .mail_opendkim import mail_opendkim
from .mail_postgres import mail_postgres

class mail_server(Base_service):

    def go(self, **kwarg):
#        if 'mail-opendkim' not in self.select_components: self.get_external_class(mail_opendkim)
        self.async_runner(tasks=[self.load_images_async, self.get_requests], images=['mail-server.img'], **kwarg)
#        self.get_requests(**kwarg);
        if 'mail-postgres' not in self.select_components: self.get_external_class(mail_postgres)
        self.add_service();

    async def get_requests(self, dialog: dict = None, external: bool = False, **kwarg):
        dialogs = dialog if isinstance(dialog, list) else [
            {
                "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'Имя обязательно к заполнению.',
                    None
#                    f'FQDN-имена не могут содержать спецсимволы, кроме "-" и "."'
                ),
                "func_parse": self.parse_fqdn(),
                "func_check": self.check_hostname(),
                "func_visibility": self.visibility_detalization(),
                "detalization": 1
            },
#            {
#                "env": f'CS_API_PORT',
#                "enable": None,
#                "msg": (
#                    f'Р7-Корпоративный сервер:\n\nВведите номер порта {"внешней " if external else ""}службы API',
#                    f'Номер порта {"внешней " if external else ""}службы API обязателен к заполнению.',
#                    f'Номер порта {"внешней " if external else ""}службы API должен состоять из чисел, буквы и спецсимволы не допустимы.'
#                ),
#                "func_check": self.check_port(),
#                "func_visibility": [self.visibility_detalization()],
#                "detalization": 3
#            },
            {
                "env": f'MAIL_NODE_MAILDIR_STORAGE',
                "enable": None,
                'msg': (
                    f'Р7-Почтовый сервер:\n\nВведите путь до директории хранения писем MDA-сервера Dovecot',
                    f'Путь до директории хранения писем обязателен к заполнению',
                    f'Указанный путь не найден'
                ),
                "func_parse": self.parse_path_dir(),
                "func_check": self.check_extended_dir(),
                "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": ('MAIL_MTA_IMAGE_NAME','MAIL_MTA_IMAGE_VERSION'),
                "default": f"{self.MAIL_MTA_IMAGE_NAME[0]}:{self.MAIL_MTA_IMAGE_VERSION[0]}",
                "enable": None,
                "msg": (
                    f'Р7-Почтовый сервер:\n\nВведите имя docker-образа в формате image:tag для почтовой службы',
                    f'Имя обязательно к заполнению.',
                    f'Имя docker-образа не может содержать спецсимволы, кроме "-", "." и ":"'
                ),
                "func_parse": self.parse_image_tag(),
                "func_check": self.check_image_tag(),
                "func_visibility": self.visibility_detalization(),
                "detalization": 5
            }
        ];
        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_MTA_IMAGE_NAME',
            'MAIL_MTA_IMAGE_VERSION',
            'MAIL_MTA_CONTAINER_NAME',
            'MAIL_MTA_HOST',
            'MAIL_DOMAIN',
            'MAIL_MTA_CERT_PATH',
            'MAIL_MTA_CERT_CRT_FILE',
            'MAIL_MTA_CERT_KEY_FILE',
            'MAIL_MTA_PORT_SMTP',
            'MAIL_MDA_PORT_IMAP',
            'MAIL_MTA_PORT_SMTPS',
            'MAIL_MTA_PORT_SMTPS_TLS',
            'MAIL_MDA_PORT_IMAPS',
            'MAIL_MDA_MAILDIR_STORAGE',
            'MAIL_NODE_MAILDIR_STORAGE',
            'MAIL_API_PORT'
        ]);

        self.service = {self.__class__.__name__.replace('_','-'): {
                'environment': {
                    'MY_HOSTNAME': f'{self.MAIL_MTA_HOST[-1]}.{self.MAIL_DOMAIN[-1]}',
                    'MY_DOMAIN': self.MAIL_DOMAIN[-1],
                    'MAIL_MTA_HOST': self.MAIL_MTA_HOST[-1],
                    'MAIL_DOMAIN': self.MAIL_DOMAIN[-1],
                    'MAIL_PSQL_HOST': self.MAIL_PSQL_HOST[-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', 'read_only': True, 'source': f'{self.CS_NODE_FRONTEND_CERT_CRT_PATH[-1]}/{self.CS_NODE_FRONTEND_CERT_CRT_FILE[-1]}', 'target': f'{self.MAIL_MTA_CERT_PATH[-1]}/{self.MAIL_MTA_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.MAIL_MTA_CERT_PATH[-1]}/{self.MAIL_MTA_CERT_KEY_FILE[-1]}'},
                    {'type': 'bind', 'read_only': False, 'source': f'{self.MAIL_NODE_MAILDIR_STORAGE[-1]}', 'target': f'{self.MAIL_MDA_MAILDIR_STORAGE[-1]}'},
                ],
                'networks': [f'net-{self.PREFIX_MAIL[0]}'],
                'ports':[
                    {'target': self.MAIL_MTA_PORT_SMTP[-1],
                    'published': 25,
                    'protocol': 'tcp',
                    'mode': 'host'},
                    {'target': self.MAIL_MDA_PORT_IMAP[-1],
                    'published': 143,
                    'protocol': 'tcp',
                    'mode': 'host'},
                    {'target': self.MAIL_MTA_PORT_SMTPS[-1],
                    'published': 465,
                    'protocol': 'tcp',
                    'mode': 'host'},
                    {'target': self.MAIL_MTA_PORT_SMTPS_TLS[-1],
                    'published': 587,
                    'protocol': 'tcp',
                    'mode': 'host'},
                    {'target': self.MAIL_MDA_PORT_IMAPS[-1],
                    'published': 993,
                    'protocol': 'tcp',
                    'mode': 'host'},
                    {'target': self.MAIL_API_PORT[-1],
                    'published': 8084,
                    'protocol': 'tcp',
                    'mode': 'host'}
                ],
#                'image': 'downloads.r7-office.ru:9011/r7office/mail-server:1.0.35-swarm',
                'image': f'{self.MAIL_MTA_IMAGE_NAME[-1]}:{self.MAIL_MTA_IMAGE_VERSION[-1]}',
                'container_name': self.MAIL_MTA_CONTAINER_NAME[-1],
                'hostname': self.MAIL_MTA_HOST[-1],
                'restart': 'always',
#                'command': '["chown", "vmail", "/mail", "&&", "bash", "start.sh", "&&", "service", "postfix", "start", "&&", "/usr/sbin/dovecot", "-F", "&&", "service", "spamassassin", "start", "&&", "/opt/r7-office/mailserver_api/mailserver_api"]'
                'post_start': [
                    {'command': 'chown vmail /mail', 'user': 'root'}
                ]
#                'command': 'chown vmail /mail && bash start.sh && service postfix start && /usr/sbin/dovecot -F && service spamassassin start && /opt/r7-office/mailserver_api/mailserver_api'
            }
        };

