"""Configuration management for AI service"""

import os
import json
from typing import Dict, Any, Optional
from dataclasses import dataclass
from pathlib import Path


@dataclass
class AIConfig:
    """Configuration for AI service"""

    mqtt_host: str = "127.0.0.1"
    mqtt_port: int = 1883
    model: str = "gpt-5-mini"
    timeout_s: int = 12
    max_tokens: int = 256
    temperature: float = 0.7
    top_p: float = 0.9
    lang: str = "fr"
    eos_ms: int = 800

    @classmethod
    def from_env(cls) -> "AIConfig":
        """Load configuration from environment variables"""
        return cls(
            mqtt_host=os.getenv("MQTT_HOST", "127.0.0.1"),
            mqtt_port=int(os.getenv("MQTT_PORT", "1883")),
            model=os.getenv("AI_MODEL", "gpt-5-mini"),
            timeout_s=int(os.getenv("AI_TIMEOUT_S", "12")),
            max_tokens=int(os.getenv("AI_MAX_TOKENS", "256")),
            temperature=float(os.getenv("AI_TEMPERATURE", "0.7")),
            top_p=float(os.getenv("AI_TOP_P", "0.9")),
            lang=os.getenv("AI_LANG", "fr"),
        )

    def update_from_mqtt(self, config_data: Dict[str, Any]) -> None:
        """Update config from MQTT retained message"""
        if "model" in config_data:
            self.model = config_data["model"]
        if "max_tokens" in config_data:
            self.max_tokens = int(config_data["max_tokens"])
        if "temperature" in config_data:
            self.temperature = float(config_data["temperature"])
        if "top_p" in config_data:
            self.top_p = float(config_data["top_p"])
        if "eos_ms" in config_data:
            self.eos_ms = int(config_data["eos_ms"])


class ConfigManager:
    """Manages configuration loading and updates"""

    def __init__(self):
        self.config = AIConfig.from_env()
        self.prompt_system = self._load_default_prompt()

    def _load_default_prompt(self) -> str:
        """Load default system prompt from file"""
        prompt_path = Path("/opt/Skull/config/prompt.txt")
        try:
            if prompt_path.exists():
                return prompt_path.read_text(encoding="utf-8").strip()
        except Exception:
            pass

        # Fallback prompt
        return (
            "Tu es un crâne joyeux, poli, humour léger. Évite politique, santé, argent."
        )

    def update_prompt_system(self, prompt_data: Dict[str, Any]) -> None:
        """Update system prompt from MQTT"""
        if "text" in prompt_data:
            self.prompt_system = prompt_data["text"]

    def get_capabilities(self) -> Dict[str, Any]:
        """Return AI capabilities"""
        return {
            "models": ["gpt-5-mini", "gpt-5-nano"],
            "lang": self.config.lang,
            "max_tokens": 512,
        }
