#/app/aroflo_connector_app/zones/tasks/join_tasktotals.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, coerce_order, build_list_params

JOIN_NAME = "tasktotals"
OP_CODE = "get_tasks_with_tasktotals"


def get_operations() -> List[ZoneOperation]:
    return [
        ZoneOperation(
            code=OP_CODE,
            label="Get Tasks with Task Totals",
            description=(
                "Devuelve tasks (zona=tasks) incluyendo el join 'tasktotals'. "
                "Útil para ver totales (mat/lab/exp/hrs) por task."
            ),
            http_method="GET",
            side_effect="read",
            idempotent=True,
            default_params={
                "where": "and|createdutc|>|2001-01-01",
                "order": None,
                "page": 1,
                "pageSize": None,
                "raw": False,
            },
            params=[
                ParamSpec("where", "string", False, "Cláusula WHERE estilo AroFlo."),
                ParamSpec("order", "string", False, "ORDER estilo AroFlo. Ej: createdutc|desc"),
                ParamSpec("page", "integer", False, "Número de página (1..N)."),
                ParamSpec("pageSize", "integer", False, "Tamaño de página (AroFlo 'pageSize')."),
                ParamSpec("raw", "boolean", False, "Si true, devuelve respuesta cruda + meta debug."),
            ],
            category="tasks",
            use_cases=[
                "Consultar totales por task",
                "Auditar costos/tiempos agregados con filtros por fechas",
            ],
            risk_level="low",
            requires_confirmation=False,
        )
    ]


def supports(operation_code: str) -> bool:
    return operation_code == OP_CODE


def execute(operation_code: str, client: Any, params: Dict[str, Any]) -> Any:
    if operation_code != OP_CODE:
        raise ValueError(f"[Tasks.join_tasktotals] Operación no soportada: {operation_code}")

    raw = bool(params.get("raw", False))
    where = params.get("where", "and|createdutc|>|2001-01-01")
    order = coerce_order(params)
    page = int(params.get("page", 1))
    if page < 1:
        raise ValueError("page debe ser >= 1.")
    pageSize = coerce_page_size(params)

    params_list = build_list_params(
        zone="tasks",
        where=where,
        join=JOIN_NAME,
        order=order,
        page=page,
        pageSize=pageSize,
    )

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