from .base_service import Base_service
from .ds_docserver import ds_docserver
import uuid

class cs_postgres(Base_service):
    def go(self, **kwarg):
# uid generator       
        if len(self.CS_PAGES_CLIENT_ID) == 0:
            self.CS_PAGES_CLIENT_ID = ['']
            self.CS_PAGES_CLIENT_SECRET = ['']
#            self.CS_FORMS_CLIENT_ID = ['']
#            self.CS_FORMS_CLIENT_SECRET = ['']
            self.CS_TEAM_CLIENT_ID = ['']
            self.CS_TEAM_CLIENT_SECRET = ['']
        elif len(self.CS_PAGES_CLIENT_ID) < 2:
            self.CS_PAGES_CLIENT_ID[-1]=str(uuid.uuid4())
        #        self.msgbox(f'Ваш UUID:\n{self.CS_PAGES_CLIENT_ID[-1]}')
            self.CS_PAGES_CLIENT_SECRET[-1]=str(uuid.uuid4())
        #        self.msgbox(f'Ваш UUID:\n{self.CS_PAGES_CLIENT_SECRET[-1]}')
#            self.CS_FORMS_CLIENT_ID[-1]=str(uuid.uuid4())
        #        self.msgbox(f'Ваш UUID:\n{self.CS_FORMS_CLIENT_ID[-1]}')
#            self.CS_FORMS_CLIENT_SECRET[-1]=str(uuid.uuid4())
        #        self.msgbox(f'Ваш UUID:\n{self.CS_FORMS_CLIENT_SECRET[-1]}')
            self.CS_TEAM_CLIENT_ID[-1]=str(uuid.uuid4())
        #        self.msgbox(f'Ваш UUID:\n{self.CS_TEAM_CLIENT_ID[-1]}')
            self.CS_TEAM_CLIENT_SECRET[-1]=str(uuid.uuid4())
        #        self.msgbox(f'Ваш UUID:\n{self.CS_TEAM_CLIENT_SECRET[-1]}')
        self.get_requests_generic();
        if 'ds-docserver' not in self.select_components: self.get_external_class(ds_docserver)
        self.async_runner(tasks=[self.load_images_async, self.get_requests], images=['cddisk-postgres.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'CS_FRONTEND_PREFIX_CDDISK',
#                "enable": None,
#                "msg": (
#                    f'Р7-Корпоративный сервер:\n\nВведите префикс для FQDN-имени сайта "Р7-Диск"',
#                    f'Префикс имени сайта обязателен к заполнению.',
#                    f'Префикс не может содержать спецсимволы, кроме "-"'
#                ),
#                "func_check": self.check_hostname(),
#                "func_visibility": [self.visibility_detalization()],
#                "detalization": 2
#            },
#            {
#                "env": f'CS_FRONTEND_PREFIX_ADMIN',
#                "enable": None,
#                "msg": (
#                    f'Р7-Корпоративный сервер:\n\nВведите префикс для FQDN-имени сайта "Р7-Панель управления"',
#                    f'Префикс имени сайта обязателен к заполнению.',
#                    f'Префикс не может содержать спецсимволы, кроме "-"'
#                ),
#                "func_check": self.check_hostname(),
#                "func_visibility": [self.visibility_detalization()],
#                "detalization": 2
#            },
#            {
#                "env": f'CS_FRONTEND_PREFIX_CDMAIL',
#                "enable": None,
#                "msg": (
#                    f'Р7-Корпоративный сервер:\n\nВведите префикс для FQDN-имени сайта "Р7-Почта"',
#                    f'Префикс имени сайта обязателен к заполнению.',
#                    f'Префикс не может содержать спецсимволы, кроме "-"'
#                ),
#                "func_check": self.check_hostname(),
#                "func_visibility": [self.visibility_detalization()],
#                "detalization": 2
#            },
#            {
#                "env": f'CS_FRONTEND_PREFIX_CONTACTS',
#                "enable": None,
#                "msg": (
#                    f'Р7-Корпоративный сервер:\n\nВведите префикс для FQDN-имени сайта "Р7-Контакты"',
#                    f'Префикс имени сайта обязателен к заполнению.',
#                    f'Префикс не может содержать спецсимволы, кроме "-"'
#                ),
#                "func_check": self.check_hostname(),
#                "func_visibility": [self.visibility_detalization()],
#                "detalization": 2
#            },
#            {
#                "env": f'CS_FRONTEND_PREFIX_CALENDAR',
#                "enable": None,
#                "msg": (
#                    f'Р7-Корпоративный сервер:\n\nВведите префикс для FQDN-имени сайта "Р7-Календарь"',
#                    f'Префикс имени сайта обязателен к заполнению.',
#                    f'Префикс не может содержать спецсимволы, кроме "-"'
#                ),
#                "func_check": self.check_hostname(),
#                "func_visibility": [self.visibility_detalization()],
#                "detalization": 2
#            },
#            {
#                "env": f'CS_FRONTEND_PREFIX_PROJECTS',
#                "enable": None,
#                "msg": (
#                    f'Р7-Корпоративный сервер:\n\nВведите префикс для FQDN-имени сайта "Р7-Проекты"',
#                    f'Префикс имени сайта обязателен к заполнению.',
#                    f'Префикс не может содержать спецсимволы, кроме "-"'
#                ),
#                "func_check": self.check_hostname(),
#                "func_visibility": [self.visibility_detalization()],
#                "detalization": 2
#            },
#            {
#                "env": f'CS_FRONTEND_PREFIX_DRAW',
#                "enable": None,
#                "msg": (
#                    f'Р7-Корпоративный сервер:\n\nВведите префикс для FQDN-имени сайта "Р7-Графика"',
#                    f'Префикс имени сайта обязателен к заполнению.',
#                    f'Префикс не может содержать спецсимволы, кроме "-"'
#                ),
#                "func_check": self.check_hostname(),
#                "func_visibility": [self.visibility_detalization()],
#                "detalization": 2
#            },
            {
                "env": f'CS_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": 4
            },
            {
                "env": f'CS_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": 5
            },
            {
                "env": f'CS_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'CS_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'CS_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'CS_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": f'CS_API_HOST',
                "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_hostname(),
                "func_visibility": [self.visibility_detalization()],
                "detalization": 3
            },
            {
                "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": 5
            },
            # {
            #     "env": f'CS_API_JAVA_PORT',
            #     "enable": None,
            #     "msg": (
            #         f'Р7-Корпоративный сервер:\n\nВведите номер открытого порта {"внешней " if external else ""}службы JVM',
            #         f'Номер порта {"внешней " if external else ""}службы  обязателен к заполнению.',
            #         f'Номер порта {"внешней " if external else ""}службы JVM должен состоять из чисел, буквы и спецсимволы не допустимы.'
            #     ),
            #     "func_check": self.check_port(),
            #     "func_visibility": [self.visibility_detalization()],
            #     "detalization": 5
            # },
            {
                "env": f'CS_PAGES_CLIENT_ID',
                "enable": None,
                'msg': (
                    f'Р7-Корпоративный сервер:\n\n{"Введите сгенерированный ранее PAGES_CLIENT_ID для модуля Страницы (указан в файле ./configs/tokens ноды с PostgreSQL) " if external else "Сгенерируйте PAGES_CLIENT_ID для модуля Страницы, либо используйте предложенный (сохранится в файле ./configs/tokens на ноде с PostgreSQL)"}',
                    f'Указание ID обязательно для работы модуля',
                    None
                ),
                "func_check": self.check_uid(),
                "func_visibility": self.visibility_detalization(),
                "detalization": 3
            },
            {
                "env": f'CS_PAGES_CLIENT_SECRET',
                "enable": None,
                'msg': (
                    f'Р7-Корпоративный сервер:\n\n{"Введите сгенерированный ранее PAGES_CLIENT_SECRET для модуля Страницы (указан в файле ./configs/tokens ноды с PostgreSQL) " if external else "Сгенерируйте PAGES_CLIENT_SECRET для модуля Страницы, либо используйте предложенный (сохранится в файле ./configs/tokens на ноде с PostgreSQL)"}',
                    f'Указание ID обязательно для работы модуля',
                    None
                ),
                "func_check": self.check_uid(),
                "func_visibility": self.visibility_detalization(),
                "detalization": 3
            },
            # {
            #     "env": f'CS_FORMS_CLIENT_ID',
            #     "enable": None,
            #     'msg': (
            #         f'Р7-Корпоративный сервер:\n\n{"Введите сгенерированный ранее FORMS_CLIENT_ID для модуля Страницы (указан в файле ./configs/tokens ноды с PostgreSQL) " if external else "Сгенерируйте FORMS_CLIENT_ID для модуля Страницы, либо используйте предложенный (сохранится в файле ./configs/tokens на ноде с PostgreSQL)"}',
            #         f'Указание ID обязательно для работы модуля',
            #         None
            #     ),
            #     "func_check": self.check_uid(),
            #     "func_visibility": self.visibility_detalization(),
            #     "detalization": 3
            # },
            # {
            #     "env": f'CS_FORMS_CLIENT_SECRET',
            #     "enable": None,
            #     'msg': (
            #         f'Р7-Корпоративный сервер:\n\n{"Введите сгенерированный ранее FORMS_CLIENT_SECRET для модуля Страницы (указан в файле ./configs/tokens ноды с PostgreSQL) " if external else "Сгенерируйте FORMS_CLIENT_SECRET для модуля Страницы, либо используйте предложенный (сохранится в файле ./configs/tokens на ноде с PostgreSQL)"}',
            #         f'Указание ID обязательно для работы модуля',
            #         None
            #     ),
            #     "func_check": self.check_uid(),
            #     "func_visibility": self.visibility_detalization(),
            #     "detalization": 3
            # },
            {
                "env": f'CS_TEAM_CLIENT_ID',
                "enable": None,
                'msg': (
                    f'Р7-Корпоративный сервер:\n\n{"Введите сгенерированный ранее TEAM_CLIENT_ID для модуля Страницы (указан в файле ./configs/tokens ноды с PostgreSQL) " if external else "Сгенерируйте TEAM_CLIENT_ID для модуля Страницы, либо используйте предложенный (сохранится в файле ./configs/tokens на ноде с PostgreSQL)"}',
                    f'Указание ID обязательно для работы модуля',
                    None
                ),
                "func_check": self.check_uid(),
                "func_visibility": self.visibility_detalization(),
                "detalization": 3
            },
            {
                "env": f'CS_TEAM_CLIENT_SECRET',
                "enable": None,
                'msg': (
                    f'Р7-Корпоративный сервер:\n\n{"Введите сгенерированный ранее TEAM_CLIENT_SECRET для модуля Страницы (указан в файле ./configs/tokens ноды с PostgreSQL) " if external else "Сгенерируйте TEAM_CLIENT_SECRET для модуля Страницы, либо используйте предложенный (сохранится в файле ./configs/tokens на ноде с PostgreSQL)"}',
                    f'Указание ID обязательно для работы модуля',
                    None
                ),
                "func_check": self.check_uid(),
                "func_visibility": self.visibility_detalization(),
                "detalization": 3
            },
        ];
        self.get_dialogs(dialogs)

    def add_service(self):
        self.env_is_default([
            'CS_PSQL_IMAGE_NAME',
            'CS_PSQL_IMAGE_VERSION',
            'CS_PSQL_CONTAINER_NAME',
            'CS_PSQL_HOST',
            'CS_PSQL_DB',
            'CS_PSQL_USER',
            'CS_PSQL_PWD',
            'CS_PSQL_PORT',
            'CS_FRONTEND_SCHEME',
            'CS_FRONTEND_DOMAIN',
#            'CS_FRONTEND_HTTP_PORT',
#            'CS_FRONTEND_HTTPS_PORT',
            'CS_FRONTEND_PREFIX_CDDISK',
            'CS_FRONTEND_PREFIX_PAYMENTS',
            'CS_FRONTEND_PREFIX_DRAW',
            'CS_FRONTEND_PREFIX_CDDISK',
            'CS_FRONTEND_PREFIX_ADMIN',
            'CS_FRONTEND_PREFIX_CDMAIL',
            'CS_FRONTEND_PREFIX_CONTACTS',
            'CS_FRONTEND_PREFIX_CALENDAR',
            'CS_FRONTEND_PREFIX_PROJECTS',
            'CS_FRONTEND_PREFIX_PAGES',
            'CS_FRONTEND_PREFIX_FORMS',
            'CS_PSQL_CORE_MACHINE_KEY',
#            'CS_API_HOST',
#            'CS_API_PORT',
            'TEAM_RABBIT_PWD',
            'DS_FRONTEND_SCHEME',
            'DS_FRONTEND_DOMAIN',
            'DS_FRONTEND_PREFIX_DOCSERVER',
            'DS_FRONTEND_HTTPS_PORT',
            'DS_DOCSERVER_JWT_KEY'
        ]);

        self.service = {self.__class__.__name__.replace('_','-'): {
                'environment':{
                    'POSTGRES_DB': self.CS_PSQL_DB[-1],
                    'POSTGRES_USER': self.CS_PSQL_USER[-1],
                    'POSTGRES_PASSWORD': self.CS_PSQL_PWD[-1],
                    'PGPORT':self.CS_PSQL_PORT[-1],
                    'r7_db_port': self.CS_PSQL_PORT[-1],
                    # 'r7_db_user': '5432',
                    # 'r7_db_host': '5432',
                    # 'r7_db_port': '5432',
                    '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_PAGES_URL': f'{self.CS_FRONTEND_SCHEME[-1]}://{self.CS_FRONTEND_PREFIX_PAGES[-1]}.{self.CS_FRONTEND_DOMAIN[-1]}:{self.CS_FRONTEND_HTTPS_PORT[-1]}',
                    'r7_FORMS_URL': f'{self.CS_FRONTEND_SCHEME[-1]}://{self.CS_FRONTEND_PREFIX_FORMS[-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_API_INTERNAL_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_JWT_KEY': self.DS_DOCSERVER_JWT_KEY[-1],
                    'ENABLE_PROJECTS': 1,
                    'r7_team_rabbit_pass': self.TEAM_RABBIT_PWD[-1],
                    'r7_PAGES_CLIENT_ID': self.CS_PAGES_CLIENT_ID[-1],
                    'r7_PAGES_CLIENT_SECRET': self.CS_PAGES_CLIENT_SECRET[-1],
                    'r7_FORMS_CLIENT_ID': self.CS_FORMS_CLIENT_ID[-1],
                    'r7_FORMS_CLIENT_SECRET': self.CS_FORMS_CLIENT_SECRET[-1],
                    'r7_TEAM_CLIENT_ID': self.CS_TEAM_CLIENT_ID[-1],
                    'r7_TEAM_CLIENT_SECRET': self.CS_TEAM_CLIENT_SECRET[-1]
                },
                'volumes':[
                    {'type': 'bind', 'source': f'{self.CS_NODE_PSQL_STORAGE[-1]}', 'target': '/var/lib/postgresql/data/'}
                ],
                'networks': [f'net-{self.PREFIX_CS[0]}'],

                'image': f'{self.CS_PSQL_IMAGE_NAME[-1]}:{self.CS_PSQL_IMAGE_VERSION[-1]}',
                'hostname': self.CS_PSQL_HOST[-1],
                'container_name': self.CS_PSQL_CONTAINER_NAME[-1],
#               'read_only': True,
                'shm_size': '128mb',
                'restart': 'unless-stopped'
            }
        };
