"""Configuration pour le module vision."""

import os
import json
from typing import Dict, Any, Optional
from dataclasses import dataclass, asdict


@dataclass
class VisionEnvConfig:
    """Configuration depuis .env"""

    resolution: str = "320x240"
    fps: int = 15
    min_detection_confidence: float = 0.6
    min_tracking_confidence: float = 0.5

    @classmethod
    def from_env(cls) -> "VisionEnvConfig":
        """Charge depuis les variables d'environnement."""
        res = os.getenv("VISION_RES", "320x240")
        fps = int(os.getenv("VISION_FPS", "15"))
        min_det = float(os.getenv("VISION_MIN_DET_CONF", "0.6"))
        min_track = float(os.getenv("VISION_MIN_TRACK_CONF", "0.5"))

        return cls(
            resolution=res,
            fps=fps,
            min_detection_confidence=min_det,
            min_tracking_confidence=min_track,
        )

    @property
    def width(self) -> int:
        return int(self.resolution.split("x")[0])

    @property
    def height(self) -> int:
        return int(self.resolution.split("x")[1])


@dataclass
class VisionMqttConfig:
    """Configuration MQTT temps réel"""

    min_detection_confidence: float = 0.6
    min_tracking_confidence: float = 0.5
    motion_threshold: float = 0.35
    eyes_alpha: float = 0.5
    neck_alpha: float = 0.2
    neck_lag_ms: int = 120
    publish_motion_cmds: bool = True

    def update_from_dict(self, data: Dict[str, Any]) -> None:
        """Met à jour depuis dict JSON."""
        for key, value in data.items():
            if hasattr(self, key):
                setattr(self, key, value)

    def to_dict(self) -> Dict[str, Any]:
        return asdict(self)


@dataclass
class GazeConfig:
    """Configuration du système gaze"""

    policy: str = "round_robin"  # closest, largest, round_robin
    dwell_ms: int = 1200
    max_targets: int = 3
    gain_eyes: float = 0.9
    gain_neck: float = 0.6

    def update_from_dict(self, data: Dict[str, Any]) -> None:
        """Met à jour depuis dict JSON."""
        for key, value in data.items():
            # Mapping des clés
            if key == "g_eyes":
                self.gain_eyes = value
            elif key == "g_neck":
                self.gain_neck = value
            elif hasattr(self, key):
                setattr(self, key, value)

    def to_dict(self) -> Dict[str, Any]:
        return asdict(self)


class ConfigManager:
    """Gestionnaire de configuration centralisé."""

    def __init__(self):
        self.env = VisionEnvConfig.from_env()
        self.vision = VisionMqttConfig()
        self.gaze = GazeConfig()

    def update_vision_config(self, data: Dict[str, Any]) -> None:
        """Met à jour config vision depuis MQTT."""
        self.vision.update_from_dict(data)

    def update_gaze_config(self, data: Dict[str, Any]) -> None:
        """Met à jour config gaze depuis MQTT."""
        self.gaze.update_from_dict(data)
