#/apps/aroflo_connector_app/zones/userpositions/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 userpositions_group():
        """Operaciones de la zona userpositions (READ ONLY)."""

    @userpositions_group.command("list")
    @click.option("--page", default=1, type=int, show_default=True)
    @click.option("--raw", is_flag=True, help="Devuelve respuesta cruda + meta debug.")
    def list_cmd(page: int, raw: bool):
        _echo(_run(zone, "list_userpositions", {"page": page, "raw": raw}))
