#/app/aroflo_connector_app/zones/overheads/cli.py
from __future__ import annotations

import json
from typing import Any, Dict, List

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 _available_ops(zone: Any) -> List[str]:
    ops = getattr(zone, "operations", [])
    return sorted([o.code for o in ops])


def _run(zone: Any, op_code: str, params: Dict[str, Any]) -> Any:
    available = set(_available_ops(zone))
    if op_code not in available:
        click.echo(f"❌ Operación '{op_code}' no existe en zona '{zone.code}'.")
        click.echo("Operaciones disponibles:")
        for c in _available_ops(zone):
            click.echo(f"  - {c}")
        raise SystemExit(2)
    return zone.execute(op_code, params=params)


def register_cli(root: click.Group, zone: Any) -> None:
    @root.group(name=zone.code)
    def overheads_group():
        """Catálogo local de overheads."""

    @overheads_group.command("list")
    @click.option("--group", default=None, help="leave/workcover/operational/break")
    @click.option("--all", "active_only", is_flag=True, default=False, help="Incluye inactivos (si existieran).")
    def list_cmd(group: str | None, active_only: bool):
        # Si el user pasa --all, active_only queda False; si no, True.
        params = {"group": group, "active_only": (not active_only)}
        _echo(_run(zone, "list_overheads", params))

    @overheads_group.command("get")
    @click.option("--id", "oid", required=True, help="ID del overhead.")
    @click.option("--all", "active_only", is_flag=True, default=False, help="Permite devolver inactivos.")
    def get_cmd(oid: str, active_only: bool):
        params = {"id": oid, "active_only": (not active_only)}
        _echo(_run(zone, "get_overhead", params))

    @overheads_group.command("search")
    @click.option("--q", required=True, help="Texto a buscar.")
    @click.option("--all", "active_only", is_flag=True, default=False, help="Incluye inactivos.")
    def search_cmd(q: str, active_only: bool):
        params = {"q": q, "active_only": (not active_only)}
        _echo(_run(zone, "search_overheads", params))
