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

from typing import Any, Dict, List

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


OP_LIST = "list_businessunits"
OP_ARCHIVED = "list_archived_businessunits"


DEFAULT_WHERE = None  # esta zona permite where opcional


def get_operations() -> List[ZoneOperation]:
    return [
        ZoneOperation(
            code=OP_LIST,
            label="List BusinessUnits",
            description="Devuelve businessunits (zone=businessunits). WHERE opcional. JOIN no aplica aquí (ver joins).",
            http_method="GET",
            side_effect="read",
            idempotent=True,
            default_params={
                "where": None,
                "page": 1,
                "pageSize": None,
                "raw": False,
            },
            params=[
                ParamSpec("where", "string", False, "Cláusula WHERE estilo AroFlo. (orgid, archived, businessunitname)"),
                ParamSpec("page", "integer", False, "Número de página (1..N)."),
                ParamSpec("pageSize", "integer", False, "Cantidad de registros por página (AroFlo pageSize)."),
                ParamSpec("raw", "boolean", False, "Si true, devuelve respuesta cruda + meta debug."),
            ],
            category="businessunits",
            use_cases=["Listar businessunits", "Filtrar businessunits usando WHERE"],
            risk_level="low",
            requires_confirmation=False,
        ),
        ZoneOperation(
            code=OP_ARCHIVED,
            label="List Archived BusinessUnits",
            description="Devuelve businessunits archivadas: where=and|archived|=|true (puedes combinar con más filtros).",
            http_method="GET",
            side_effect="read",
            idempotent=True,
            default_params={
                "where": "and|archived|=|true",
                "page": 1,
                "pageSize": None,
                "raw": False,
            },
            params=[
                ParamSpec("where", "string", False, "WHERE estilo AroFlo. Por defecto and|archived|=|true"),
                ParamSpec("page", "integer", False, "Número de página (1..N)."),
                ParamSpec("pageSize", "integer", False, "Cantidad de registros por página (AroFlo pageSize)."),
                ParamSpec("raw", "boolean", False, "Si true, devuelve respuesta cruda + meta debug."),
            ],
            category="businessunits",
            use_cases=["Listar businessunits archivadas", "Filtrar archivadas por orgid u otros filtros"],
            risk_level="low",
            requires_confirmation=False,
        ),
    ]


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


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

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

    if operation_code == OP_LIST:
        where = params.get("where", None)

        params_list = build_list_params(
            zone="businessunits",
            where=where,
            join=None,
            page=page,
            pageSize=pageSize,
        )
        resp = request(client, "GET", params_list)
        return raw_wrap(resp, params_list) if raw else resp

    if operation_code == OP_ARCHIVED:
        where = params.get("where") or "and|archived|=|true"

        params_list = build_list_params(
            zone="businessunits",
            where=where,
            join=None,
            page=page,
            pageSize=pageSize,
        )
        resp = request(client, "GET", params_list)
        return raw_wrap(resp, params_list) if raw else resp

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