#/apps/aroflo_connector_app/agent/cheap/zone_resolvers/permissiongroups.py
from __future__ import annotations

from typing import Any, Dict, Set

from ..plan import Plan, MissingParam
from ..extractors import extract_kv_params

ZONE_CODE = "permissiongroups"
OP_LIST = "list_permissiongroups"


def build_plan(*, question: str, intent: str, available_ops: Set[str]) -> Plan:
    """
    PermissionGroups es READ ONLY y la doc solo muestra GET con:
      - zone=permissiongroups
      - page=1

    Regla: NO inventar params.
    - Aceptamos page (int).
    - Ignoramos pagesize/pageSize si lo pasan (no está en la doc).
    """

    # Si por alguna razón el manifest no tiene esta operación, devolvemos plan no listo.
    if OP_LIST not in available_ops:
        return Plan(
            zone_code=ZONE_CODE,
            op_code=OP_LIST,
            side_effect="read",
            needs_confirmation=False,
            summary="Operation not available in this zone capabilities (unexpected).",
            missing=[MissingParam(name="op_code", hint=f"Missing operation '{OP_LIST}' in capabilities")],
        )

    kv = extract_kv_params(question)

    params: Dict[str, Any] = {}

    # page (documentado en ejemplo)
    page = kv.get("page")
    if page is None:
        params["page"] = 1
    else:
        try:
            params["page"] = int(page)
        except Exception:
            # No inventamos: caemos a default seguro + dejamos hint en summary
            params["page"] = 1

    # pagesize/pageSize NO documentado: se ignora, pero lo dejamos explícito en summary
    ignored = []
    if "pagesize" in kv:
        ignored.append("pagesize")
    if "pagesize" not in kv and "pagesize" in kv:
        ignored.append("pageSize")

    summary = "List permission groups (READ ONLY)."
    if ignored:
        summary += f" Ignored undocumented param(s): {', '.join(ignored)}."

    return Plan(
        zone_code=ZONE_CODE,
        op_code=OP_LIST,
        params=params,
        side_effect="read",
        needs_confirmation=False,
        summary=summary,
    )
