#/apps/aroflo_connector_app/zones/permissiongroups/_join_utils.py
from __future__ import annotations

from typing import Any, Dict, List, Tuple, Optional
from urllib.parse import urlencode


def request(client: Any, method: str, params_list: List[Tuple[str, str]]) -> Any:
    """
    Copia del estándar (tasks/users):
    - Construye var_string con urlencode(params_list)
    - GET: querystring usando params=list[tuple]
    - POST: body application/x-www-form-urlencoded (no aplica en esta zona, pero se deja estándar)
    """
    var_string = urlencode(params_list)
    method_u = (method or "GET").upper()

    if method_u == "POST":
        return client.request(
            "",
            method="POST",
            params=None,
            data=var_string,
            var_string=var_string,
            headers={"Content-Type": "application/x-www-form-urlencoded"},
        )

    return client.request("", method=method_u, params=params_list, var_string=var_string)


def raw_wrap(resp: Any, params_list: List[Tuple[str, str]]) -> Dict[str, Any]:
    return {
        "data": resp,
        "meta": {
            "params": params_list,
            "var_string": urlencode(params_list),
        },
    }


def build_list_params(*, zone: str, page: int) -> List[Tuple[str, str]]:
    """
    PermissionGroups doc: solo zone + page.
    No se documenta where/order/join/pageSize => NO se incluyen.
    """
    if page < 1:
        raise ValueError("page debe ser >= 1.")
    return [
        ("zone", zone),
        ("page", str(int(page))),
    ]


# ----------------------------
# Context snapshots (opcional)
# ----------------------------

def remember_permissiongroups_if_present(bridge: Any, result: Any) -> None:
    """
    Si el result trae zoneresponse.permissiongroups, guarda la lista para referencias tipo:
      'permissiongroup #2'
    """
    try:
        if not isinstance(result, dict):
            return
        zr = result.get("zoneresponse")
        if not isinstance(zr, dict):
            return
        items = zr.get("permissiongroups")
        if isinstance(items, list) and items:
            bridge.set_list("permissiongroups.permissiongroups", items)
    except Exception:
        return


def remember_permissiongroups_from_result(bridge: Any, result: Any) -> None:
    """
    Alias explícito (por simetría con otras zonas).
    """
    remember_permissiongroups_if_present(bridge, result)


def get_permissiongroup_by_index(bridge: Any, idx: int) -> Optional[Dict[str, Any]]:
    """
    idx humano 1-based.
    """
    try:
        items = bridge.get_list("permissiongroups.permissiongroups") or []
        if not isinstance(items, list):
            return None
        i = int(idx) - 1
        if i < 0 or i >= len(items):
            return None
        item = items[i]
        return item if isinstance(item, dict) else None
    except Exception:
        return None

