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

Almacena la configuración en ~/.jama/config.yaml con valores
por defecto sensatos para la conexión al servidor cloud.
"""
import platform
import socket
from pathlib import Path
from typing import Any

import yaml
from pydantic import BaseModel, Field

JAMA_DIR = Path.home() / ".jama"
CONFIG_PATH = JAMA_DIR / "config.yaml"

# Defaults
DEFAULT_HEARTBEAT_INTERVAL = 30
DEFAULT_RECONNECT_MAX_DELAY = 60


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 ~/.jama si no existe."""
    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 ~/.jama/config.yaml."""
    ensure_jama_dir()
    data = config.model_dump()
    with open(CONFIG_PATH, "w") as f:
        yaml.dump(data, f, default_flow_style=False)
