import re
from .base_service import Base_service

class cs_rabbitmq(Base_service):

    def go(self, **kwarg):
        self.async_runner(tasks=[self.load_images_async, self.get_requests], images=['cddisk-rabbitmq.img'], **kwarg)
#        self.get_requests(**kwarg);
#        if self.BACK_MENU[0]==True:
#            return        
        self.add_service();

    async def get_requests(self, prefix_env: str = "CS", dialog: list = None, external:bool = False, **kwarg):
        dialogs = dialog if isinstance(dialog, list) else [
#             {
#                 "env": f'TEAM_RABBIT_USER',
#                 "enable": None,
#                 'msg': (
#                     f'Р7-Корпоративный сервер:\n\nВведите имя пользователя {"внешнего " if external else ""}сервера RabbitMQ для интеграции Р7-Команда',
#                     f'Имя пользователя {"внешнего " if external else ""}сервера RabbitMQ обязателен к заполнению.',
#                     None
# #                    f'Имя пользователя {"внешнего " if external else ""}сервера RabbitMQ не может содержать спецсимволы, кроме "-" и "_"'
#                 ),
#                 "func_check": self.check_user(),
#                 "func_visibility": self.visibility_detalization(),
#                 "detalization": 6
#             },
#             {
#                 "env": f'TEAM_RABBIT_PWD',
#                 "enable": None,
#                 'msg': (
#                     f'Р7-Корпоративный сервер:\n\nВведите пароль пользователя {"внешнего " if external else ""}сервера RabbitMQ для интеграции с Р7-Команда',
#                     f'Пароль пользователя {"внешнего " if external else ""}сервера RabbitMQ обязателен к заполнению.',
#                     f'Пароль не может быть пустым или содержать символы, отличные от A-z, 0-9 и символы "_", "-"'
#                 ),
#                 "func_check": self.check_pwd(),
#                 "func_visibility": [self.visibility_detalization(), self.visibility_default()],
#                 "detalization": 6
#             },
            {
                "env": f'{prefix_env}_RABBIT_HOST',
                "enable": None,
                "msg": (
                    f'Р7-Корпоративный сервер:\n\nВведите адрес {"внешнего " if external else ""}сервера RabbitMQ для продукта Р7-{prefix_env}',
                    f'Адрес {"внешнего " if external else ""}сервера RabbitMQ обязателен к заполнению.',
                    f'Адрес {"внешнего " if external else ""}сервера RabbitMQ не может содержать спецсимволы, кроме "-" и "."'
                ),
                "func_check": self.check_hostname(),
                "func_visibility": self.visibility_detalization(),
                "detalization": 4
            },
            {
                "env": f'{prefix_env}_RABBIT_PORT',
                "enable": None,
                "msg": (
                    f'Р7-Корпоративный сервер:\n\nВведите номер открытого порта {"внешнего " if external else ""}сервера RabbitMQ для продукта Р7-{prefix_env}',
                    f'Номер порта {"внешнего " if external else ""}сервера RabbitMQ обязателен к заполнению.',
                    f'Номер порта {"внешнего " if external else ""}сервера RabbitMQ должен состоять из чисел, буквы и спецсимволы не допустимы.'
                ),
                "func_check": self.check_port(),
                "func_visibility": self.visibility_detalization(),
                "detalization": 5
            },
            {
                "env": f'{prefix_env}_RABBIT_USER',
                "enable": None,
                'msg': (
                    f'Р7-Корпоративный сервер:\n\nВведите имя пользователя {"внешнего " if external else ""}сервера RabbitMQ для продукта Р7-{prefix_env}',
                    f'Имя пользователя {"внешнего " if external else ""}сервера RabbitMQ обязателен к заполнению.',
#                    f'Имя пользователя {"внешнего " if external else ""}сервера RabbitMQ не может содержать спецсимволы, кроме "-" и "_"'
                ),
                "func_check": self.check_user(),
                "func_visibility": self.visibility_detalization(),
                "detalization": 2
            },
            {
                "env": f'{prefix_env}_RABBIT_PWD',
                "enable": None,
                'msg': (
                    f'Р7-Корпоративный сервер:\n\nВведите пароль пользователя {"внешнего " if external else ""}сервера RabbitMQ для продукта Р7-{prefix_env}',
                    f'Пароль пользователя {"внешнего " if external else ""}сервера RabbitMQ обязателен к заполнению.',
                    f'Пароль не может быть пустым или содержать символы, отличные от A-z, 0-9 и символы "_", "-"'
                ),
                "func_check": self.check_pwd(),
                "func_visibility": [self.visibility_detalization(), self.visibility_default()],
                "detalization": 1
            }
        ];
        self.get_dialogs(dialogs)
#        if self.BACK_MENU[0]==True:
#            return
#        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 check_pwd(self):
        return lambda response, env: ((re.match(r'^[a-zA-Z_][a-zA-Z0-9_-]*$', response) and not response == ''), None)
#r'[A-Za-z0-9!$%^&_\-=\+~`.,\(\)*{}\[\]|]+'
    def add_service(self):
        self.env_is_default([
            'CS_RABBIT_IMAGE_NAME',
            'CS_RABBIT_IMAGE_VERSION',
            'CS_RABBIT_CONTAINER_NAME',
            'CS_RABBIT_HOST',
            'CS_RABBIT_USER',
            'CS_RABBIT_PWD',
            'CS_RABBIT_PORT',
            'TEAM_RABBIT_PWD',
        ]);


        self.service = {self.__class__.__name__.replace('_','-'): {
                'environment':{
                    'RABBITMQ_DEFAULT_USER':self.CS_RABBIT_USER[-1],
                    'RABBITMQ_DEFAULT_PASS':self.CS_RABBIT_PWD[-1],
                    'RABBITMQ_NODE_PORT': self.CS_RABBIT_PORT[-1],
                    'r7_team_rabbit_pass': self.TEAM_RABBIT_PWD[-1]
                },
                'networks': [f'net-{self.PREFIX_CS[0]}'],
                'image': f'{self.CS_RABBIT_IMAGE_NAME[-1]}:{self.CS_RABBIT_IMAGE_VERSION[-1]}',
                'container_name': self.CS_RABBIT_CONTAINER_NAME[-1],
                'hostname': self.CS_RABBIT_HOST[-1],
                'restart': 'unless-stopped',
                'ports':[
                    {'target': self.CS_RABBIT_PORT[-1],
#                    'published': self.CS_NODE_RABBIT_PORT_PUBLISHED[-1],
                    'published': self.CS_RABBIT_PORT[-1],
                    'protocol': 'tcp',
                    'mode': 'host'}
                ]
            }
        };
