"""Per-service configuration registry."""

from __future__ import annotations

from dataclasses import dataclass, field
from typing import Optional


@dataclass
class ServiceConfig:
    """Defaults for a service, overridable per-request."""

    service_id: str
    model: str
    system_prompt: Optional[str] = None
    prompt_template_id: Optional[str] = None
    temperature: float = 0.0
    max_output_tokens: int = 4096
    extra: dict = field(default_factory=dict)


# Default configurations per service
_DEFAULTS: dict[str, ServiceConfig] = {
    "screening": ServiceConfig(
        service_id="screening",
        model="gpt-5-nano",
        max_output_tokens=8192,
    ),
    "screening.clustering": ServiceConfig(
        service_id="screening.clustering",
        model="gpt-4.1",
        max_output_tokens=32000,
    ),
    "extraction": ServiceConfig(
        service_id="extraction",
        model="gpt-5-mini",
        max_output_tokens=28224,
    ),
    "indexer": ServiceConfig(
        service_id="indexer",
        model="gpt-5-mini",
        max_output_tokens=4096,
    ),
    "criteria": ServiceConfig(
        service_id="criteria",
        model="gpt-4.1",
        max_output_tokens=8192,
    ),
    "deduplication": ServiceConfig(
        service_id="deduplication",
        model="n/a",
        extra={"description": "Bibliographic deduplication — no LLM required, uses fingerprinting + fuzzy matching"},
    ),
}


class ConfigRegistry:
    """Manages per-service defaults. In-memory with defaults."""

    def __init__(self):
        self._configs: dict[str, ServiceConfig] = dict(_DEFAULTS)

    def get_config(self, service_id: str) -> ServiceConfig:
        if service_id not in self._configs:
            return ServiceConfig(service_id=service_id, model="gpt-5-nano")
        return self._configs[service_id]

    def update_config(self, service_id: str, overrides: dict) -> ServiceConfig:
        config = self.get_config(service_id)
        for key, value in overrides.items():
            if hasattr(config, key):
                setattr(config, key, value)
            else:
                config.extra[key] = value
        self._configs[service_id] = config
        return config

    def list_configs(self) -> list[ServiceConfig]:
        return list(self._configs.values())


# Global registry instance
_registry: ConfigRegistry | None = None


def get_registry() -> ConfigRegistry:
    global _registry
    if _registry is None:
        _registry = ConfigRegistry()
    return _registry
