from .base_service import Base_service
from .ds_docserver import ds_docserver
import string
import secrets
import uuid
import hashlib
import sys 

class grafana(Base_service):
    def go(self, **kwarg):

#         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'GRAFANA_HOSTNAME',
                "enable": None,
                "msg": (
                    f'Grafana-Loki:\n\nВведите адрес {"внешней " if external else ""}службы GRAFANA',
                    f'Адрес {"внешней " if external else ""}службы GRAFANA обязателен к заполнению.',
                    f'Адрес {"внешней " if external else ""}службы GRAFANA не может содержать спецсимволы, кроме "-" и "."'
                ),
                "func_check": self.check_hostname(),
                "func_visibility": [self.visibility_detalization()],
                "detalization": 1
            },
            {
                "env": f'GRAFANA_PORT',
                "enable": None,
                "msg": (
                    f'Grafana-Loki:\n\nВведите номер открытого порта {"внешней " if external else ""}службы GRAFANA',
                    f'Номер порта {"внешней " if external else ""}службы GRAFANA обязателен к заполнению.',
                    f'Номер порта {"внешней " if external else ""}службы GRAFANA должен состоять из чисел, буквы и спецсимволы не допустимы.'
                ),
                "func_check": self.check_port(),
                "func_visibility": [self.visibility_detalization()],
                "detalization": 1
            },
            {
                "env": f'GRAFANA_SECURITY_ADMIN_USER',
                "enable": None,
                'msg': (
                    f'Grafana-Loki:\n\nВведите имя пользователя {"внешнего " if external else ""}сервера Grafana',
                    f'Имя пользователя {"внешнего " if external else ""}сервера Grafana обязателен к заполнению.',
                    None
                ),
                "func_check": self.check_user(),
                "func_visibility": self.visibility_detalization(),
                "detalization": 2
            },
            {
                "env": f'GRAFANA_SECURITY_ADMIN_PASSWORD',
                "enable": None,
                'msg': (
                    f'Grafana-Loki:\n\nВведите пароль пользователя {"внешнего " if external else ""}сервера Grafana',
                    f'Пароль пользователя {"внешнего " if external else ""}сервера Grafana обязателен к заполнению.',
                    f'Пароль не может быть пустым'
                ),
                "func_check": self.check_pwd(),
                "func_visibility": self.visibility_detalization(),
                "detalization": 1
            },
            {
                "env": f'GRAFANA_DATA',
                "enable": None,
                'msg': (
                    f'Grafana-Loki:\n\nВведите путь до директории хранения данных Grafana',
                    f'Путь до директории хранения данных обязателен к заполнению',
                    f'Указанный путь не найден'
                ),
                "func_parse": self.parse_path_dir(),
                "func_check": self.check_extended_dir(),
                "func_visibility": self.visibility_detalization(),
                "detalization": 1
            },
        ];
        self.get_dialogs(dialogs)

    def add_service(self):

        self.service = {self.__class__.__name__.replace('_','-'): {
                'environment':{
#                    '# Uncomment GF_SERVER_DOMAIN, GF_SERVER_ROOT_URL for using reserve proxy',
#                    '#GF_SERVER_DOMAIN: "grafana.domain.example" # change "grafana.domain.example" to your domain',
#                    '#GF_SERVER_ROOT_URL: "https://grafana.domain.example/" # change "grafana.domain.example" to your domain',
                    'GF_RENDERING_SERVER_URL': self.GRAFANA_RENDERING_SERVER_URL[-1],
                    'GF_RENDERING_CALLBACK_URL': self.GRAFANA_RENDERING_CALLBACK_URL[-1],
                    'GF_UNIFIED_ALERTING_SCREENSHOTS_CAPTURE': self.GRAFANA_UNIFIED_ALERTING_SCREENSHOTS_CAPTURE[-1],
                    'GF_LOG_FILTERS': self.GRAFANA_LOG_FILTERS[-1],
                    'GF_SECURITY_ADMIN_USER': self.GRAFANA_SECURITY_ADMIN_USER[-1],
                    'GF_SECURITY_ADMIN_PASSWORD': self.GRAFANA_SECURITY_ADMIN_PASSWORD[-1]
                },
                'volumes':[
                    {'type': 'bind', 'source': f'{sys.path[0]}/configs/grafana/grafana-config/', 'target': '/etc/grafana'},
                    {'type': 'bind', 'source': f'{self.GRAFANA_DATA[-1]}', 'target': '/var/lib/grafana'}
                ],
                'user': 'root',
                'networks': [f'net-{self.PREFIX_CS[0]}'],
#                'image': f'{self.CS_PSQL_IMAGE_NAME[-1]}:{self.CS_PSQL_IMAGE_VERSION[-1]}',
                'image': f'{self.GRAFANA_IMAGE_NAME[-1]}:{self.GRAFANA_IMAGE_VERSION[-1]}',
                'hostname': self.GRAFANA_HOSTNAME[-1],
                'container_name': self.GRAFANA_CONTAINER_NAME[-1],
#               'read_only': True,
#                'shm_size': '128mb',
                'restart': 'unless-stopped',
                'ports':[
                    {'target': 3000,
                    'published': self.GRAFANA_PORT[-1],
                    'protocol': 'tcp',
                    'mode': 'host'}
                ],
                'deploy':{
                    'mode': 'replicated',
                    'replicas': '1',
                    'update_config':{
                        'order': 'stop-first'},
                    'resources':{
                        'limits':
                            {'memory': '1024M'}
                    }
                }
            }
        }
