"""
config_loader.py — Chargement centralisé de la configuration Lucas

Usage:
    from config_loader import get_config, get_client_info

    cfg = get_config()
    api_key = cfg.get("gemini", "api_key")

    client = get_client_info("Demo_01")
    senior_name = client.get("senior_name", "Senior")
"""

import configparser
import json
import os

_config = None
_config_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "lucas_config.ini")
_db_path = None


def get_config():
    """Charge et cache la configuration globale depuis lucas_config.ini"""
    global _config, _db_path
    if _config is None:
        _config = configparser.ConfigParser()
        _config.read(_config_path)
        _db_path = _config.get("database", "clients_db", fallback="/var/www/lucas/database.json")
    return _config


def get_db():
    """Charge la base de données clients"""
    cfg = get_config()
    try:
        with open(_db_path, 'r') as f:
            return json.load(f)
    except Exception:
        return {"clients": {}}


def get_client_info(client_id):
    """Charge les infos d'un client par son name (client_id)

    Cherche dans database.json un client dont le champ 'name' correspond.
    Retourne le dict du client ou {} si non trouvé.
    """
    db = get_db()
    clients = db.get("clients", {})

    # Recherche par clé directe
    if client_id in clients:
        return clients[client_id]

    # Recherche par champ 'name' (compatibilité avec les clients indexés numériquement)
    for key, client in clients.items():
        if client.get("name", "").lower() == client_id.lower():
            return client

    return {}


def get_client_fcm_tokens(client_id):
    """Retourne la liste des tokens FCM d'un client"""
    client = get_client_info(client_id)
    return client.get("fcm_tokens", [])


def get_site_ports(site_number):
    """Calcule les ports pour un numéro de site donné

    Returns: dict avec base_port, rtsp_ports (list), audio_port, webui_port
    """
    cfg = get_config()
    base_start = cfg.getint("ports", "base_start", fallback=8550)
    ports_per_site = cfg.getint("ports", "ports_per_site", fallback=10)

    base_port = base_start + (site_number - 1) * ports_per_site
    return {
        "base_port": base_port,
        "rtsp_ports": list(range(base_port, base_port + 6)),
        "audio_port": base_port + 6,
        "webui_port": base_port + 7,
    }


def get_next_site_number():
    """Retourne le prochain numéro de site disponible"""
    db = get_db()
    clients = db.get("clients", {})
    max_site = 0
    for client in clients.values():
        sn = client.get("site_number", 0)
        if isinstance(sn, int) and sn > max_site:
            max_site = sn
    return max_site + 1
