#/apps/aroflo_connector_app/zones/timesheets/cli.py
from __future__ import annotations

import json
from typing import Any, Optional

import click


def _echo(result: Any) -> None:
    if isinstance(result, (dict, list)):
        click.echo(json.dumps(result, indent=2, ensure_ascii=False))
    else:
        click.echo(str(result))


def register_cli(root: click.Group, zone: Any) -> None:
    """
    Estándar:
    - recibe root y la instancia de zona
    - NO crea client, NO toca env, NO toca registry
    """

    @root.group(name=zone.code)
    def timesheets_group():
        """Operaciones de la zona timesheets (READ ONLY)."""

    @timesheets_group.command("list")
    @click.option("--timesheetid", default=None, help="Filtro exacto por timesheetid.")
    @click.option("--taskid", default=None, help="Filtro exacto por taskid.")
    @click.option("--userid", default=None, help="Filtro exacto por userid.")
    @click.option(
        "--type",
        "type_",
        default=None,
        help="Productive | Non-Productive | Expense",
    )
    @click.option("--workdate", default=None, help='Fecha para filtrar (recomendado "YYYY-MM-DD").')
    @click.option("--workdate-op", default=">", show_default=True, help="Operador para workdate: =, >, <, != ...")
    @click.option("--page", default=1, type=int, show_default=True)
    @click.option("--page-size", default=500, type=int, show_default=True, help="maxpageresults server-side.")
    @click.option("--order", default="workdate|asc", show_default=True)
    @click.option("--raw", is_flag=True, help="Devuelve respuesta cruda + meta debug.")
    @click.option("--max-items", default=50, type=int, show_default=True, help="Recorte local (UX/CLI).")
    def list_cmd(
        timesheetid: Optional[str],
        taskid: Optional[str],
        userid: Optional[str],
        type_: Optional[str],
        workdate: Optional[str],
        workdate_op: str,
        page: int,
        page_size: int,
        order: str,
        raw: bool,
        max_items: int,
    ):
        result = zone.execute(
            "list_timesheets",
            params={
                "timesheetid": timesheetid,
                "taskid": taskid,
                "userid": userid,
                "type": type_,
                "workdate": workdate,
                "workdate_op": workdate_op,
                "page": page,
                "page_size": page_size,
                "order": order,
                "raw": raw,
                "max_items": max_items,
            },
        )
        _echo(result)

    # Alias: since (por ergonomía, sin tocar el default where de AroFlo)
    @timesheets_group.command("since")
    @click.option("--workdate", required=True, help='Ej: "2021-05-19"')
    @click.option("--workdate-op", default=">", show_default=True)
    @click.option("--userid", default=None, help="Opcional: filtrar por userid.")
    @click.option("--taskid", default=None, help="Opcional: filtrar por taskid.")
    @click.option("--type", "type_", default=None, help="Productive | Non-Productive | Expense")
    @click.option("--page", default=1, type=int, show_default=True)
    @click.option("--page-size", default=500, type=int, show_default=True)
    @click.option("--order", default="workdate|asc", show_default=True)
    @click.option("--raw", is_flag=True)
    @click.option("--max-items", default=50, type=int, show_default=True)
    def since_cmd(
        workdate: str,
        workdate_op: str,
        userid: Optional[str],
        taskid: Optional[str],
        type_: Optional[str],
        page: int,
        page_size: int,
        order: str,
        raw: bool,
        max_items: int,
    ):
        result = zone.execute(
            "list_timesheets",
            params={
                "workdate": workdate,
                "workdate_op": workdate_op,
                "userid": userid,
                "taskid": taskid,
                "type": type_,
                "page": page,
                "page_size": page_size,
                "order": order,
                "raw": raw,
                "max_items": max_items,
            },
        )
        _echo(result)
