#/app/aroflo_connector_app/agent/cheap/zone_resolvers/timesheets.py
from __future__ import annotations

from typing import Any, Dict, Set, List

from ..plan import Plan, MissingParam
from ..extractors import (
    extract_kv_params,
    extract_page_and_pagesize,
    extract_where_tail,
)
# Si tienes context_bridge para resolver ids por índice, lo añadimos después.


WRITE_OPS: Set[str] = set()  # timesheets en este paquete lo dejamos READ ONLY por ahora


def build_plan(*, question: str, intent: str, available_ops: Set[str]) -> Plan:
    q = question or ""
    missing: List[MissingParam] = []

    op_code = intent if intent in available_ops else "list_timesheets"
    side_effect = "write" if op_code in WRITE_OPS else "read"

    params: Dict[str, Any] = {}
    kv = extract_kv_params(q)

    READ_KEYS = {
        "page", "pageSize", "pagesize", "where", "order",
        "timesheetid",
        "userid",
        "taskid",
        "type",
        "workdate",
    }

    for k, v in kv.items():
        if k in READ_KEYS:
            params[k] = v

    if "pagesize" in params and "pageSize" not in params:
        params["pageSize"] = params["pagesize"]

    where = extract_where_tail(q)
    if where:
        params["where"] = where

    page, pagesize = extract_page_and_pagesize(q)
    if page is not None:
        params["page"] = page
    if pagesize is not None:
        params["pageSize"] = pagesize

    # Required params enforcement
    if op_code == "get_timesheet":
        if not params.get("timesheetid"):
            missing.append(MissingParam("timesheetid", "Provide timesheetid=..."))

    if op_code == "get_timesheets_by_user":
        if not params.get("userid"):
            missing.append(MissingParam("userid", "Provide userid=..."))

    if op_code == "get_timesheets_by_task":
        if not params.get("taskid"):
            missing.append(MissingParam("taskid", "Provide taskid=..."))

    if op_code == "get_timesheets_by_type":
        if not params.get("type"):
            missing.append(MissingParam("type", "Provide type=... (ej task/overhead)"))

    if op_code == "get_timesheets_after_workdate":
        if not params.get("workdate"):
            missing.append(MissingParam("workdate", "Provide workdate=YYYY-MM-DD"))

    if op_code not in available_ops:
        op_code = "list_timesheets"
        side_effect = "read"

    summary = f"timesheets.{op_code} ({side_effect})"

    return Plan(
        zone_code="timesheets",
        op_code=op_code,
        params=params,
        side_effect=side_effect,  # type: ignore[arg-type]
        needs_confirmation=False,
        summary=summary,
        missing=missing,
    )
