"""Overrides runtime persistés sur disque pour les Settings.

Les Settings par defaut viennent de .env (12-factor). L'utilisateur peut
surcharger certains champs depuis l'UI (ex: modele Ollama choisi) — ces
overrides sont stockes dans un fichier JSON local, relus a chaque requete.

Thread-safe via un lock simple : suffisant pour un deploiement mono-process
(usage local). Si un jour on passe en multi-worker, migrer vers SQLite.
"""
from __future__ import annotations

import json
import threading
from pathlib import Path
from typing import Any

_LOCK = threading.Lock()
_OVERRIDES_PATH = Path("data/settings.json")


def load_overrides() -> dict[str, Any]:
    """Retourne le dict d'overrides, ou {} si le fichier n'existe pas / est corrompu."""
    if not _OVERRIDES_PATH.exists():
        return {}
    try:
        return json.loads(_OVERRIDES_PATH.read_text(encoding="utf-8"))
    except (OSError, json.JSONDecodeError):
        return {}


def save_overrides(patch: dict[str, Any]) -> dict[str, Any]:
    """Fusionne `patch` dans les overrides existants et persiste. Retourne l'etat final."""
    with _LOCK:
        current = load_overrides()
        current.update(patch)
        _OVERRIDES_PATH.parent.mkdir(parents=True, exist_ok=True)
        _OVERRIDES_PATH.write_text(
            json.dumps(current, indent=2, ensure_ascii=False),
            encoding="utf-8",
        )
        return current
