import os

from .base_service import Base_service
from .ds_rabbitmq import ds_rabbitmq
from .ds_postgres import ds_postgres
from .ds_redis import ds_redis

class ds_docserver(Base_service):

    def go(self, **kwarg):
        if 'ds-rabbitmq' not in self.select_components: self.get_external_class(ds_rabbitmq)
        if 'ds-postgres' not in self.select_components: self.get_external_class(ds_postgres)
        if 'ds-redis' not in self.select_components: self.get_external_class(ds_redis)
        self.async_runner(tasks=[self.load_images_async, self.get_requests], images=['ds-app.img'], **kwarg)
#        self.get_requests(**kwarg);
        self.add_service();

    async def get_requests(self, prefix_env: str = "DS", dialog: list = None, external:bool = False, **kwarg):
        dialogs = dialog if isinstance(dialog, list) else [
            {
                "env": f'DS_DOCSERVER_HOST',
                "enable": None,
                "msg": (
                    f'Р7-Сервер документов:\n\nВведите адрес {"внешнего " if external else ""}сервера Docserver',
                    f'Адрес {"внешнего " if external else ""}сервера Docserver обязателен к заполнению.',
                    f'Адрес {"внешнего " if external else ""}сервера Docserver не может содержать спецсимволы, кроме "-" и "."'
                ),
                "func_check": self.check_hostname(),
                "func_visibility": self.visibility_detalization(),
                "detalization": 3
            },
            {
                "env": f'DS_DOCSERVER_PORT',
                "enable": None,
                "msg": (
                    f'Р7-Сервер документов:\n\nВведите номер открытого порта {"внешнего " if external else ""}сервера Docserver',
                    f'Номер порта {"внешнего " if external else ""}сервера Docserver обязателен к заполнению.',
                    f'Номер порта {"внешнего " if external else ""}сервера Docserver должен состоять из чисел, буквы и спецсимволы не допустимы.'
                ),
                "func_check": self.check_port(),
                "func_visibility": self.visibility_detalization(),
                "detalization": 5
            },
            {
                "env": 'DS_DOCSERVER_JWT_KEY',
                "enable": None,
                "msg": (
                    f'Р7-Сервер документов:\n\nВведите JWT токен для продукта Р7-DS',
                    f'JWT токет обязателен к заполнению.',
                    f'JWT токен не может быть пустым'
                ),
                "func_check": self.check_pwd(),
                "func_visibility": self.visibility_detalization(),
                "detalization": 2
            },
            {
                "env": f'DS_NODE_FILE_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
            },
            {
                "env": f'DS_NODE_LICENSE_FILE',
                "enable": None,
                'msg': (
                    f'Р7-Cервер документов:\n\nВведите путь до файла лицензии',
                    f'Путь до файла лицензии обязателен к заполнению',
                    f'Файл не найден'
                ),
                "func_parse": self.parse_default(),
                "func_check": self.check_file(),
                "func_visibility": self.visibility_detalization(),
                "detalization": 4
            },
            {
                "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)
#        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") or request["env"].endswith("_KEY")
#                );
#            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([
            'DS_DOCSERVER_IMAGE_NAME',
            'DS_DOCSERVER_IMAGE_VERSION',
            'DS_DOCSERVER_CONTAINER_NAME',
            'DS_DOCSERVER_HOST',
            'DS_DOCSERVER_PORT',
            'DS_DOCSERVER_JWT_KEY',
            'DS_NODE_FILE_STORAGE',
            'DS_STORAGE_S3_REGION',
            'DS_STORAGE_S3_ENDPOINT',
            'DS_STORAGE_S3_BUCKET_NAME',
            'DS_STORAGE_S3_ACCESS_KEY_ID',
            'DS_STORAGE_S3_SECRET_ACCESS_KEY',
            'DS_PSQL_HOST',
            'DS_PSQL_PORT',
            'DS_PSQL_DB',
            'DS_PSQL_USER',
            'DS_PSQL_PWD',
            'DS_REDIS_HOST',
            'DS_REDIS_PORT',
            'DS_RABBIT_HOST',
            'DS_RABBIT_PORT',
            'DS_RABBIT_USER',
            'DS_RABBIT_PWD',
            'DS_NODE_LICENSE_FILE'
        ]);

        self.service = {self.__class__.__name__.replace('_','-'): {
                'environment':{
                    'r7_JWT_KEY': self.DS_DOCSERVER_JWT_KEY[-1],
                    'S3_REGION': self.DS_STORAGE_S3_REGION[-1],
                    'S3_ENDPOINT': self.DS_STORAGE_S3_ENDPOINT[-1],
                    'S3_BUCKET_NAME': self.DS_STORAGE_S3_BUCKET_NAME[-1],
                    'S3_ACCESS_KEY_ID': self.DS_STORAGE_S3_ACCESS_KEY_ID[-1],
                    'S3_SECRET_ACCESS_KEY': self.DS_STORAGE_S3_SECRET_ACCESS_KEY[-1],
                    'S3_STORAGE_FOLDER_NAME': 'files',
                    'S3_NAME': 'storage-fs',
                    'S3_CACHE_FOLDER_NAME': 'data',
                    'S3_URL_EXPIRES': '604800',
                    'S3_SSL_ENABLED': 'false',
                    'S3_FORCE_PATH_STYLE': 'true',
                    'r7_db_host': self.DS_PSQL_HOST[-1],
                    'r7_db_port': self.DS_PSQL_PORT[-1],
                    'r7_db_name': self.DS_PSQL_DB[-1],
                    'r7_db_user': self.DS_PSQL_USER[-1],
                    'r7_db_pass': self.DS_PSQL_PWD[-1],
                    'r7_redis_host': self.DS_REDIS_HOST[-1],
                    'r7_redis_port': self.DS_REDIS_PORT[-1],
                    'r7_rabbitmq_host': self.DS_RABBIT_HOST[-1],
                    'r7_rabbitmq_port': self.DS_RABBIT_PORT[-1],
                    'r7_rabbitmq_user': self.DS_RABBIT_USER[-1],
                    'r7_rabbitmq_pass': self.DS_RABBIT_PWD[-1],
                },
                'volumes':[
                    {'type': 'volume', 'source': 'ds-www', 'target': '/var/www/r7-office'},
                    {'type': 'volume', 'source': 'ds-www', 'target': '/var/lib/r7-office'},
                    {'type': 'bind', 'source': f'{self.DS_NODE_FILE_STORAGE[-1]}/plugins', 'target': '/var/www/r7-office/documentserver/sdkjs-plugins'},
                    {'type': 'bind', 'source': f'{self.DS_NODE_FILE_STORAGE[-1]}/fonts', 'target': '/usr/share/fonts'},
                    {'type': 'bind', 'source': f'{self.DS_NODE_FILE_STORAGE[-1]}/cache', 'target': '/var/lib/r7-office/documentserver/App_Data/cache/files/data'},
                    {'type': 'bind', 'source': f'{self.GENERAL_NODE_LOGS_STORAGE[-1]}/converter', 'target': '/var/log/r7-office/documentserver/converter'},
                    {'type': 'bind', 'source': f'{self.GENERAL_NODE_LOGS_STORAGE[-1]}/docservice', 'target': '/var/log/r7-office/documentserver/docservice'},
                    {'type': 'bind', 'source': f'{self.GENERAL_NODE_LOGS_STORAGE[-1]}/metrics', 'target': '/var/log/r7-office/documentserver/metrics'}
                ],
                'networks': [f'net-{self.PREFIX_DS[0]}'],
                'image': f'{self.DS_DOCSERVER_IMAGE_NAME[-1]}:{self.DS_DOCSERVER_IMAGE_VERSION[-1]}',
                'hostname': self.DS_DOCSERVER_HOST[-1],
                'container_name': self.DS_DOCSERVER_CONTAINER_NAME[-1],
                'restart': 'unless-stopped',
                'depends_on': ['ds-rabbitmq','ds-postgres','ds-redis']
            }
        };
        if os.path.isfile(self.DS_NODE_LICENSE_FILE[-1]):
            self.service[self.__class__.__name__.replace('_','-')]['volumes'].append({'type': 'bind', 'source': f'{self.DS_NODE_LICENSE_FILE[-1]}', 'target': '/var/www/r7-office/Data/license.lic'})
