# common/utils/cache/regions.py
import time

import redis
from dogpile.cache import make_region
import ssl

def get_redis_config(app):
    """
    Create Redis configuration dict based on app config.
    Handles both authenticated and non-authenticated setups.
    """
    app.logger.debug(f"Creating Redis config")
    # Parse the REDIS_BASE_URI to get all components
    # redis_uri = urlparse(app.config['REDIS_BASE_URI'])

    config = {
        'host': app.config['REDIS_URL'],
        'port': app.config['REDIS_PORT'],
        'max_connections': 20,
        'retry_on_timeout': True,
        'socket_keepalive': True,
        'socket_keepalive_options': {},
    }

    # Add authentication if provided
    un = app.config.get('REDIS_USER')
    pw = app.config.get('REDIS_PASS')
    if un and pw:
        config.update({
            'username': un,
            'password': pw
        })

    # SSL support using centralised config
    cert_path = app.config.get('REDIS_CA_CERT_PATH')
    redis_scheme = app.config.get('REDIS_SCHEME')
    if cert_path and redis_scheme == 'rediss':
        config.update({
            'connection_class': redis.SSLConnection,
            'ssl_cert_reqs': ssl.CERT_REQUIRED,
            'ssl_check_hostname': app.config.get('REDIS_SSL_CHECK_HOSTNAME', True),
            'ssl_ca_certs': cert_path,
        })

    app.logger.debug(f"config for Redis connection: {config}")

    return config


def create_cache_regions(app):
    """Initialise all cache regions with app config"""
    redis_config = get_redis_config(app)
    redis_pool = redis.ConnectionPool(**redis_config)
    regions = {}
    startup_time = int(time.time())

    # Region for model-related caching (ModelVariables etc)
    model_region = make_region(name='eveai_model').configure(
        'dogpile.cache.redis',
        arguments={'connection_pool': redis_pool},
        replace_existing_backend=True
    )
    regions['eveai_model'] = model_region

    # Region for eveai_chat_workers components (Specialists, Retrievers, ...)
    eveai_chat_workers_region = make_region(name='eveai_chat_workers').configure(
        'dogpile.cache.redis',
        arguments={'connection_pool': redis_pool},
        replace_existing_backend=True
    )
    regions['eveai_chat_workers'] = eveai_chat_workers_region

    # Region for eveai_workers components (Processors, ...)
    eveai_workers_region = make_region(name='eveai_workers').configure(
        'dogpile.cache.redis',
        arguments={'connection_pool': redis_pool},  # Same config for now
        replace_existing_backend=True
    )
    regions['eveai_workers'] = eveai_workers_region

    eveai_config_region = make_region(name='eveai_config').configure(
        'dogpile.cache.redis',
        arguments={'connection_pool': redis_pool},
        replace_existing_backend=True
    )
    regions['eveai_config'] = eveai_config_region

    return regions

