"""
Gestión de configuración del Agent CLI.

Almacena la configuración en un directorio por SO:
  - macOS/Linux: ~/.jama/config.yaml
  - Windows: %APPDATA%/jama/config.yaml
"""
import os
import platform
import socket
from pathlib import Path
from typing import Any

import yaml
from pydantic import BaseModel, Field

# Defaults
DEFAULT_HEARTBEAT_INTERVAL = 30
DEFAULT_RECONNECT_MAX_DELAY = 60


def _get_jama_dir() -> Path:
    """Retorna el directorio de configuración según el SO.

    - Windows: %APPDATA%/jama
    - macOS/Linux: ~/.jama
    """
    if platform.system() == "Windows":
        appdata = os.environ.get("APPDATA", "")
        if appdata:
            return Path(appdata) / "jama"
    return Path.home() / ".jama"


JAMA_DIR = _get_jama_dir()
CONFIG_PATH = JAMA_DIR / "config.yaml"


class AgentConfig(BaseModel):
    """Configuración del agent CLI."""

    server_url: str = Field("http://localhost:8000", description="URL del servidor Jama")
    agent_name: str = Field(
        default_factory=lambda: socket.gethostname(),
        description="Nombre del agent (default: hostname)",
    )
    heartbeat_interval: int = Field(
        DEFAULT_HEARTBEAT_INTERVAL,
        ge=5,
        le=300,
        description="Intervalo de heartbeat en segundos",
    )
    reconnect_max_delay: int = Field(
        DEFAULT_RECONNECT_MAX_DELAY,
        ge=5,
        le=300,
        description="Delay máximo de reconexión en segundos",
    )
    os_type: str = Field(
        default_factory=lambda: platform.system().lower(),
        description="Tipo de SO (auto-detectado)",
    )


def ensure_jama_dir() -> Path:
    """Crea el directorio de configuración si no existe."""
    if platform.system() == "Windows":
        # Windows no soporta el argumento mode en mkdir
        JAMA_DIR.mkdir(parents=True, exist_ok=True)
    else:
        JAMA_DIR.mkdir(mode=0o700, parents=True, exist_ok=True)
    return JAMA_DIR


def load_config() -> AgentConfig:
    """Carga la configuración desde disco o retorna defaults."""
    if CONFIG_PATH.exists():
        try:
            with open(CONFIG_PATH) as f:
                data: dict[str, Any] = yaml.safe_load(f) or {}
            return AgentConfig(**data)
        except Exception:
            pass
    return AgentConfig()


def save_config(config: AgentConfig) -> None:
    """Guarda la configuración en el directorio de jama."""
    ensure_jama_dir()
    data = config.model_dump()
    with open(CONFIG_PATH, "w") as f:
        yaml.dump(data, f, default_flow_style=False)
