import sys

from .base_service import Base_service

class minio(Base_service):

    def go(self, **kwarg):
        self.async_runner(tasks=[self.load_images_async, self.get_requests], images=['minio.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'DS_STORAGE_S3_ACCESS_KEY_ID',
                "enable": None,
                'msg': (
                    f'Р7-S3:\n\nВведите имя пользователя {"внешнего " if external else ""}сервера S3 minio',
                    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'DS_STORAGE_S3_SECRET_ACCESS_KEY',
                "enable": None,
                'msg': (
                    f'Р7-S3:\n\nВведите пароль пользователя {"внешнего " if external else ""}сервера S3 minio',
                    f'Пароль пользователя {"внешнего " if external else ""}сервера PostgreSQL обязателен к заполнению.',
                    f'Пароль не может быть пустым'
                ),
                "func_check": self.check_pwd(),
                "func_visibility": self.visibility_detalization(),
                "detalization": 1
            },            
            {
                "env": f'DS_STORAGE_S3_ENDPOINT',
                "enable": None,
                "msg": (
                    f'Р7-S3:\n\nВведите адрес {"внешней " if external else ""}службы S3 minio',
                    f'Адрес {"внешней " if external else ""}службы API обязателен к заполнению.',
                    f'Адрес {"внешней " if external else ""}службы API не может содержать спецсимволы, кроме "-" и "."'
                ),
                "func_check": self.check_hostname(),
                "func_visibility": [self.visibility_detalization()],
                "detalization": 2
            },
            {
                "env": f'DS_STORAGE_S3_PORT_API',
                "enable": None,
                "msg": (
                    f'Р7-S3:\n\nВведите номер открытого порта API {"внешней " if external else ""}службы S3 minio',
                    f'Номер порта {"внешней " if external else ""}службы API обязателен к заполнению.',
                    f'Номер порта {"внешней " if external else ""}службы API должен состоять из чисел, буквы и спецсимволы не допустимы.'
                ),
                "func_check": self.check_port(),
                "func_visibility": [self.visibility_detalization()],
                "detalization": 2
            },
            {
                "env": f'DS_STORAGE_S3_PORT_HTTP',
                "enable": None,
                "msg": (
                    f'Р7-S3:\n\nВведите номер открытого порта HTTP{"внешней " if external else ""}службы S3 minio',
                    f'Номер порта {"внешней " if external else ""}службы API обязателен к заполнению.',
                    f'Номер порта {"внешней " if external else ""}службы API должен состоять из чисел, буквы и спецсимволы не допустимы.'
                ),
                "func_check": self.check_port(),
                "func_visibility": [self.visibility_detalization()],
                "detalization": 2
            },
            # {
            #     "env": f'GENERAL_NODE_LOGS_STORAGE',
            #     "enable": None,
            #     'msg': (
            #         f'Р7-Корпоративный сервер:\n\nВведите путь до директории хранения логов',
            #         f'Путь до директории хранения логов обязателен к заполнению',
            #         f'Указанный путь не найден'
            #     ),
            #     "func_parse": self.parse_path_dir(),
            #     "func_check": self.check_extended_dir(),
            #     "func_visibility": self.visibility_detalization(),
            #     "detalization": 2
            # }
        ];
        self.get_dialogs(dialogs)


    def add_service(self):
        # self.env_is_default([
        #     'CS_API_CERT_OAUTH_FILE',
        #     'CS_API_IMAGE_NAME',
        #     'CS_API_IMAGE_VERSION',
        #     'CS_API_CONTAINER_NAME',
        #     'CS_API_PORT',
        #     'CS_NODE_API_PORT_PUBLISHED',
        #     'GENERAL_NODE_LOGS_STORAGE'
        # ]);

        self.service = {self.__class__.__name__.replace('_','-'): {
                'environment': {
#                    'r7_api_port': self.CS_API_PORT[-1],
                    # 'r7_filestorage_host': self.CS_FILESTORAGE_HOST[-1],
                    # 'r7_filestorage_tcp_port': self.CS_FILESTORAGE_PORT_TCP[-1],
                    # 'r7_registry_addr': f'http://{self.CS_REGISTRY_HOST[-1]}:{self.CS_REGISTRY_PORT[-1]}',
                    # 'r7_searchapi_addr': f'http://{self.CS_SEARCH_HOST[-1]}:{self.CS_SEARCH_PORT[-1]}',
                    # 'r7_rabbitmq_host': self.CS_RABBIT_HOST[-1],
                    # 'r7_rabbitmq_user': self.CS_RABBIT_USER[-1],
                    # 'r7_rabbitmq_pass': self.CS_RABBIT_PWD[-1],
                    'MINIO_ROOT_USER': self.DS_STORAGE_S3_ACCESS_KEY_ID[-1],
                    'MINIO_ROOT_PASSWORD': self.DS_STORAGE_S3_SECRET_ACCESS_KEY[-1],
                    'MINIO_DEFAULT_BUCKETS': self.DS_STORAGE_S3_BUCKET_NAME[-1],
#                    'r7_auth20_cert_file': self.CS_API_CERT_OAUTH_FILE[-1],
#                    'r7_auth20_cert_file': 'certificate.pfx',
#                    'r7_API_S3_KEY': '',
#                    'r7_API_S3_SECRET': '',
#                    'r7_API_S3_REGION': '',
#                    'r7_API_S3_BUCKET': '',
#                    'r7_API_S3_URL': '',
#                    'r7_API_KEY_TAB_FILE': '',
#                    'r7_API_ESIA_TYPE': '',
#                    'r7_API_COMMUNITY_REPOSITORY_CONN_STRING': '',
#                    'r7_DRAW_SSL_PORT': '',
#                    'r7_ADMIN_PROXY_URL': '',
#                    'r7_MAIL_PROXY_URL': '',
#                    'r7_CONTACTS_PROXY_URL': '',
#                    'r7_CALENDAR_PROXY_URL': '',
#                    'r7_PROJECTS_PROXY_URL': '',
#                    'r7_DISK_PROXY_URL': '',
#                    'r7_API_URL': f'{self.CS_FRONTEND_SCHEME[-1]}://{self.CS_FRONTEND_PREFIX_CDDISK[-1]}.{self.CS_FRONTEND_DOMAIN[-1]}:{self.CS_FRONTEND_HTTPS_PORT[-1]}/api',
#                    'r7_PAYMENTS_URL': f'{self.CS_FRONTEND_SCHEME[-1]}://{self.CS_FRONTEND_PREFIX_PAYMENTS[-1]}.{self.CS_FRONTEND_DOMAIN[-1]}:{self.CS_FRONTEND_HTTPS_PORT[-1]}',
#                    'r7_DRAW_URL': f'{self.CS_FRONTEND_SCHEME[-1]}://{self.CS_FRONTEND_PREFIX_DRAW[-1]}.{self.CS_FRONTEND_DOMAIN[-1]}:{self.CS_FRONTEND_HTTPS_PORT[-1]}',
#                    'r7_SITE_URL': f'{self.CS_FRONTEND_SCHEME[-1]}://{self.CS_FRONTEND_PREFIX_CDDISK[-1]}.{self.CS_FRONTEND_DOMAIN[-1]}:{self.CS_FRONTEND_HTTPS_PORT[-1]}',
#                    'r7_DS_FRONTEND_URL': f'{self.DS_FRONTEND_SCHEME[-1]}://{self.DS_FRONTEND_PREFIX_DOCSERVER[-1]}.{self.DS_FRONTEND_DOMAIN[-1]}:{self.DS_FRONTEND_HTTPS_PORT[-1]}',
#                    'r7_SITE_DOMAIN': f'{self.CS_FRONTEND_DOMAIN[-1]}',
#                    'r7_ADMIN_URL': f'{self.CS_FRONTEND_SCHEME[-1]}://{self.CS_FRONTEND_PREFIX_ADMIN[-1]}.{self.CS_FRONTEND_DOMAIN[-1]}:{self.CS_FRONTEND_HTTPS_PORT[-1]}',
#                    'r7_CDMAIL_URL': f'{self.CS_FRONTEND_SCHEME[-1]}://{self.CS_FRONTEND_PREFIX_CDMAIL[-1]}.{self.CS_FRONTEND_DOMAIN[-1]}:{self.CS_FRONTEND_HTTPS_PORT[-1]}',
#                    'r7_CONTACT_URL': f'{self.CS_FRONTEND_SCHEME[-1]}://{self.CS_FRONTEND_PREFIX_CONTACTS[-1]}.{self.CS_FRONTEND_DOMAIN[-1]}:{self.CS_FRONTEND_HTTPS_PORT[-1]}',
#                    'r7_CALENDAR_URL': f'{self.CS_FRONTEND_SCHEME[-1]}://{self.CS_FRONTEND_PREFIX_CALENDAR[-1]}.{self.CS_FRONTEND_DOMAIN[-1]}:{self.CS_FRONTEND_HTTPS_PORT[-1]}',
#                    'r7_PROJECTS_URL': f'{self.CS_FRONTEND_SCHEME[-1]}://{self.CS_FRONTEND_PREFIX_PROJECTS[-1]}.{self.CS_FRONTEND_DOMAIN[-1]}:{self.CS_FRONTEND_HTTPS_PORT[-1]}',
#                    'r7_CORE_MACHINE_KEY': self.CS_PSQL_CORE_MACHINE_KEY[-1],
#                    'r7_API_INTERNAL_URL': f'http://{self.CS_API_HOST[-1]}:{self.CS_API_PORT[-1]}',
#                    'r7_JWT_KEY': self.DS_DOCSERVER_JWT_KEY[-1],
#                    'r7_team_rabbit_pass': self.TEAM_RABBIT_PWD[-1]
                },
                'volumes':[
                    {'type': 'bind', 'source': f'{sys.path[0]}/data/minio', 'target': '/data'},

                    # {'type': 'bind', 'source': f'{sys.path[0]}/configs/ssl', 'target': '/opt/r7-office/Api/ssl'},
                    # {'type': 'bind', 'source': f'{sys.path[0]}/configs/api/filestorage.json', 'target': '/opt/r7-office/Api/filestorage.json'},
                    # {'type': 'bind', 'source': f'{sys.path[0]}/configs/api/filestorage_temp', 'target': '/var/r7-office/filestorage_temp/'},
                    # {'type': 'bind', 'source': f'{sys.path[0]}/configs/api/appsettings.json', 'target': '/opt/r7-office/Api/appsettings.json'},
                    # {'type': 'bind', 'source': f'{sys.path[0]}/configs/api/nlog.config', 'target': '/opt/r7-office/Api/nlog.config'},
                    # {'type': 'bind', 'source': f'{self.GENERAL_NODE_LOGS_STORAGE[-1]}/api', 'target': '/var/log/r7-office/CDDisk/R7.Storage.Server.Api.Host'},
                    # {'type': 'bind', 'source': f'{sys.path[0]}/configs/api/domain.pfx', 'target': '/opt/r7-office/Api/domain.pfx'}
#                    {'type': 'bind', 'source': f'{sys.path[0]}/configs/api/{self.CS_API_CERT_OAUTH_FILE[-1]}', 'target': '/opt/r7-office/Api/{self.CS_API_CERT_OAUTH_FILE[-1]}'}
                ],
                'networks': [f'net-{self.PREFIX_CS[0]}',f'net-{self.PREFIX_DS[0]}',f'net-{self.PREFIX_MAIL[0]}'],
                'ports':[
                    {'target': 9000,
                    'published': self.DS_STORAGE_S3_PORT_API[-1],
                    'protocol': 'tcp',
                    'mode': 'host'},
                    {'target': 9001,
                    'published': self.DS_STORAGE_S3_PORT_HTTP[-1],
                    'protocol': 'tcp',
                    'mode': 'host'}
                ],
                'image': f'{self.MINIO_IMAGE_NAME[-1]}',#:{self.CS_API_IMAGE_VERSION[-1]}',
                'container_name': self.MINIO_CONTAINER_NAME[-1],
                'restart': 'unless-stopped',
                'command': 'server /data --console-address' ": 9001",
            }
        };

