from cmf.config import *
from common.config import *
from custom.config import *


# Приведём CORS_ALLOWED_DOMAINS к нормальному и удобному виду
if CORS_ALLOWED_DOMAINS and isinstance(CORS_ALLOWED_DOMAINS, str):
    CORS_ALLOWED_DOMAINS = [domain for domain in CORS_ALLOWED_DOMAINS.split() if domain]


def _init_versions():
    global CMF_VERSION, EVA_VERSION, EVA_BRANCH, PRODUCTION
    from pathlib import Path

    git_path = Path(PROJECT_DIR, '.git')
    branch = None
    version = None
    branch_path = Path('/opt/eva_branch')
    version_path = Path('/opt/eva_version')

    if branch_path.exists():
        branch = branch_path.read_text().strip('\n')

    if version_path.exists():
        version = version_path.read_text().strip('\n')

    if git_path.exists():
        # cmd = f'cd {PROJECT_DIR}; git show --format=%H | head -n 1'
        # res, out = run_bash_command(cmd, sudo=False)
        # CMF_VERSION = out.decode().strip('\n')
        head = (git_path/'HEAD').read_text().strip('\n')

        if 'ref: ' in head:
            branch = head.split('/')[-1]
            head_path = git_path/(head.split(' ', maxsplit=1)[-1])
            if head_path.exists():
                version = head_path.read_text().strip('\n')
        else:
            version = head
    CMF_VERSION = version
    EVA_VERSION = version
    EVA_BRANCH = branch
    if PRODUCTION is None and EVA_BRANCH:
        for branch_prefix in ('devel', 'release', 'master'):
            if EVA_BRANCH.startswith(branch_prefix):
                PRODUCTION = True
                break


def _patch_config():
    global EVA_ACCOUNT_USE, IS_BOX_VERSION

    # Old deploy sets values as str !!!
    # EVA_ACCOUNT_USE from eva-app
    try:
        if EVA_ACCOUNT_USE == 'False':
            EVA_ACCOUNT_USE = False
    except NameError:
        pass

    if IS_BOX_VERSION == 'False':
        IS_BOX_VERSION = False
    elif IS_BOX_VERSION == 'True':
        IS_BOX_VERSION = True


def _vault_init():
    """
    Поддерживаем конфигурацию:
    VAULT_ENABLED=true
    VAULT_URL=https://vault.example.com:8200
    VAULT_TOKEN=s.xxxxxxxxxxxxxxxx

    Конфигурация с 1 редисом
    VAULT_REDIS_PATH="eva/redis"

    Конфигурация с несколькими редисами
    VAULT_REDIS1_NAME="default"
    VAULT_REDIS1_PATH="eva/redis"
    VAULT_REDIS2_NAME="secondary"
    VAULT_REDIS2_PATH="eva/redis_secondary"

    VAULT_POSTGRES_PATH="eva/postgres"
    """
    import hvac, os, sys

    if os.getenv('VAULT_ENABLED', '').lower() != 'true':
        return

    def load_cache_settings():
        redis_settings = {}

        for i in ['', *range(10)]:
            redis_prefix = f'VAULT_REDIS{i}'
            path = os.environ.get(f'{redis_prefix}_PATH')

            if not path:
                continue

            if i == '':
                name = "default"
            else:
                name = os.environ.get(f'{redis_prefix}_NAME')
                if not name:
                    print(f'VAULT Укажите {redis_prefix}_NAME', file=sys.stderr)
                    exit(0)
            print(f'VAULT Получаем настройки для {redis_prefix} {name} ({path})', file=sys.stderr)

            redis_connection_config = client.secrets.kv.v2.read_secret(path=path, mount_point=mount_point)['data'][
                'data']

            # Вносим изменения в дефолтный конфиг
            redis_settings[name] = {
                "type": "redis",
                # "host": required,
                "port": "6379",
                "db": 7
            }
            redis_settings[name].update(redis_connection_config)
            print(
                f'VAULT Получили настройки доступа в Redis из vault для {name}: {list(redis_connection_config.keys())}',
                file=sys.stderr)

        if redis_settings:
            print(
                f'VAULT Применили настройки доступа в Redis из vault для {list(redis_settings.keys())}',
                file=sys.stderr)
            local_cache_settings.update(redis_settings)
        else:
            print('VAULT настройки для Redis не переданы', file=sys.stderr)

    def load_pg_settings():
        path = os.environ['VAULT_POSTGRES_PATH']

        print(f'VAULT Получаем настройки для Postgres ({path})', file=sys.stderr)
        # 2 раза data - это ок (kv v2). В первой data ответ, включая metadata, внутри нее сами данные в data
        # metadata содержит дату создания версии и саму текущую версию, поскольку kv v2 поддерживает
        # версионирование
        pg_connection_config = client.secrets.kv.v2.read_secret(path=path, mount_point=mount_point)['data']['data']
        vault_msg = (
            'VAULT Получили настройки доступа в Postgres из vault для '
            f'default: {list(pg_connection_config.keys())}'
        )
        print(vault_msg, file=sys.stderr)

        # Вносим изменения в дефолтный конфиг
        pg_settings = dict(data_sources['default'])
        pg_settings.update(pg_connection_config)
        data_sources['default'] = pg_settings

    # !!! config_load before init_logging...
    print('Включена интеграция с vault', file=sys.stderr)

    if 'VAULT_URL' not in os.environ or 'VAULT_TOKEN' not in os.environ:
        print('VAULT Error! Не указаны параметры VAULT_URL и VAULT_TOKEN!', file=sys.stderr)
        sys.exit(0)

    url = os.environ['VAULT_URL']
    token = os.environ['VAULT_TOKEN']
    mount_point = os.getenv('VAULT_MOUNT_POINT', 'secret')
    client = hvac.Client(url=url, token=token)

    try:
        # only in eva-app, converter
        local_cache_settings = cache_settings
    except NameError:
        local_cache_settings = {}

    if 'default' not in local_cache_settings:
        load_cache_settings()
    else:
        print('VAULT Для текущего APP не используется Redis', file=sys.stderr)

    if 'VAULT_POSTGRES_PATH' in os.environ:
        if 'default' in data_sources:
            load_pg_settings()
        else:
            print('VAULT Для текущего APP не используется Postgres', file=sys.stderr)
    else:
        print('VAULT Найстройки для PostgreSQL не переданы', file=sys.stderr)


_init_versions()
_patch_config()
_vault_init()
