#/apps/aroflo_connector_app/services/capabilities.py
from __future__ import annotations

from typing import Any, Dict, List

from ..zones.registry import build_registry
from ..zones.base import ZoneOperation, ParamSpec


def _paramspec_to_dict(p: ParamSpec) -> Dict[str, Any]:
    data = {
        "name": p.name,
        "type": p.type,
        "required": p.required,
        "description": p.description,
        "enum": p.enum,
    }

    # NUEVO
    if p.items_schema is not None:
        data["items_schema"] = p.items_schema

    return data



def _operation_to_dict(op: ZoneOperation, fallback_category: str) -> Dict[str, Any]:
    """
    Convierte un ZoneOperation en un dict serializable a JSON,
    incluyendo la metadata que definimos en Fase 1.
    """
    return {
        "code": op.code,
        "label": op.label,
        "description": op.description,
        "http_method": op.http_method,
        "default_params": op.default_params,
        "params": [_paramspec_to_dict(p) for p in op.params],
        "side_effect": op.side_effect,
        "idempotent": op.idempotent,
        # Metadata IA
        "category": op.category or fallback_category,
        "use_cases": op.use_cases,
        "examples": op.examples,
        "risk_level": op.risk_level,
        "requires_confirmation": op.requires_confirmation,
    }


def build_capabilities_manifest(client: Any) -> Dict[str, Any]:
    """
    Construye un manifest de capacidades para TODAS las zonas registradas.

    Importante:
    - NO llama a la API de AroFlo.
    - Solo instancia las zonas y lee sus operaciones.
    - Es seguro ejecutarlo en cualquier entorno.
    """
    registry = build_registry(client)

    zones_payload: List[Dict[str, Any]] = []

    for code, zone in registry.items():
        zone_dict: Dict[str, Any] = {
            "code": zone.code,
            "label": zone.label,
            "description": zone.description,
            "operations": [],
        }

        for op in zone.operations:
            zone_dict["operations"].append(_operation_to_dict(op, fallback_category=zone.code))

        zones_payload.append(zone_dict)

    manifest: Dict[str, Any] = {
        "schema_version": "1.0",
        "app": "aroflo_connector_app",
        "zones": zones_payload,
    }
    return manifest
