#/apps/aroflo_connector_app/zones/userpositions/base.py
from __future__ import annotations

from typing import Any, Dict, List, Tuple

from ..base import ZoneOperation, ParamSpec
from ._join_utils import request, raw_wrap

# -------------------------
# Operation codes (READ only)
# -------------------------
OP_LIST = "list_userpositions"


def get_operations() -> List[ZoneOperation]:
    return [
        ZoneOperation(
            code=OP_LIST,
            label="List UserPositions",
            description=(
                "Devuelve userpositions. Nota: AroFlo expone esto bajo zone=permissiongroups "
                "y responde en zoneresponse.userpositions."
            ),
            http_method="GET",
            side_effect="read",
            idempotent=True,
            default_params={"page": 1, "raw": False},
            params=[
                ParamSpec("page", "integer", False, "Número de página (1..N)."),
                ParamSpec("raw", "boolean", False, "Si true, devuelve respuesta cruda + meta debug."),
            ],
            category="userpositions",
            use_cases=["Listar posiciones de usuario", "Inspeccionar configuración de posiciones"],
            risk_level="low",
            requires_confirmation=False,
        )
    ]


def supports(operation_code: str) -> bool:
    return operation_code in {OP_LIST}


def execute(operation_code: str, client: Any, params: Dict[str, Any]) -> Any:
    raw = bool(params.get("raw", False))

    if operation_code == OP_LIST:
        page = int(params.get("page", 1))
        if page < 1:
            raise ValueError("page debe ser >= 1.")

        # CLAVE: la zona real en AroFlo es permissiongroups
        params_list: List[Tuple[str, str]] = [
            ("zone", "permissiongroups"),
            ("page", str(page)),
        ]

        resp = request(client, "GET", params_list)
        return raw_wrap(resp, params_list) if raw else resp

    raise ValueError(f"[UserPositions.base] Operación no soportada: {operation_code}")
