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

import json
import logging
import os
from typing import Dict, Any, List, Tuple

import click
from dotenv import load_dotenv
from urllib.parse import urlencode

from .client import AroFloClient, AroFloError
from .config import AroFloConfigError, AroFloSettings

# Cargar variables desde .env automáticamente cuando uses la CLI
# (se asume que ejecutas la CLI desde /var/www/html/flask_server)
load_dotenv(os.path.join(os.getcwd(), ".env"))

logging.basicConfig(
    level=logging.INFO,
    format="%(levelname)s:%(name)s:%(message)s",
)
log = logging.getLogger("aroflo_cli")


def make_client() -> AroFloClient:
    """
    Helper central para crear el cliente AroFlo para comandos generales.
    """
    return AroFloClient()


@click.group()
@click.option("--debug", is_flag=True, help="Activa logs en modo DEBUG.")
def cli(debug: bool) -> None:
    """CLI para la AroFlo Connector App."""
    if debug:
        logging.getLogger().setLevel(logging.DEBUG)
        log.debug("Modo DEBUG activado.")


# --------------------------------------------------------------------
#  Comando: envcheck
# --------------------------------------------------------------------
@cli.command()
def envcheck() -> None:
    """Verifica que las variables de entorno necesarias estén presentes."""
    try:
        settings = AroFloSettings.from_env()
    except AroFloConfigError as exc:
        click.echo("❌ Configuración incompleta:")
        click.echo(str(exc))
        raise SystemExit(1)

    click.echo("✅ Configuración OK. Valores leídos:")
    masked = {
        "base_url": settings.base_url,
        "u_encoded": settings.u_encoded[:4] + "...",
        "p_encoded": settings.p_encoded[:4] + "...",
        "api_secret": settings.api_secret[:4] + "...",
        "org_encoded": settings.org_encoded[:4] + "...",
        "accept": settings.accept,
        "host_ip": settings.host_ip,
        "timeout": settings.timeout,
    }
    click.echo(json.dumps(masked, indent=2))


# --------------------------------------------------------------------
#  Helpers para el ping / users-raw (los que ya tenías)
# --------------------------------------------------------------------
def build_users_query() -> Tuple[Dict[str, Any], str]:
    """
    Replica el urlVarString del script de Postman para zone=users.
    """
    params_list: List[Tuple[str, Any]] = [
        ("zone", "users"),
        ("where", "and|createdutc|>|2001-01-01"),
        ("page", "1"),
    ]
    var_string = urlencode(params_list)  # zone=users&where=...&page=1
    params = dict(params_list)
    return params, var_string


@cli.command()
def ping() -> None:
    """
    Ping simple a AroFlo usando base_url + ?zone=users...
    """
    try:
        client = make_client()
    except AroFloConfigError as exc:
        click.echo("❌ Error de configuración:")
        click.echo(str(exc))
        raise SystemExit(1)

    params, var_string = build_users_query()

    try:
        data = client.request(
            "",
            method="GET",
            params=params,
            var_string=var_string,
        )
    except AroFloError as exc:
        click.echo("❌ Error al conectar con AroFlo:")
        click.echo(str(exc))
        raise SystemExit(1)

    click.echo("✅ Conexión OK a zone=users. Respuesta resumida:")
    click.echo(json.dumps(data, indent=2))


@cli.command("users-raw")
@click.option("--include-raw", is_flag=True, help="Imprime la respuesta completa en JSON.")
def users_raw(include_raw: bool) -> None:
    """
    Lista usuarios desde AroFlo usando zone=users en base_url (versión antigua).
    """
    try:
        client = make_client()
    except AroFloConfigError as exc:
        click.echo("❌ Error de configuración:")
        click.echo(str(exc))
        raise SystemExit(1)

    params, var_string = build_users_query()

    try:
        data = client.request(
            "",
            method="GET",
            params=params,
            var_string=var_string,
        )
    except AroFloError as exc:
        click.echo("❌ Error al obtener usuarios:")
        click.echo(str(exc))
        raise SystemExit(1)

    if include_raw:
        click.echo(json.dumps(data, indent=2))
        return

    zone = data.get("zoneresponse", {})
    records = zone.get("users") or zone.get("items") or zone.get("records") or []

    click.echo(f"Usuarios recibidos: {len(records)}")
    for u in records:
        uid = u.get("userid") or u.get("UserID") or u.get("id")
        name = (
            u.get("name")
            or u.get("UserName")
            or u.get("username")
            or f"{u.get('givennames', '')} {u.get('surname', '')}".strip()
        )
        click.echo(f"- {uid}: {name}")


# --------------------------------------------------------------------
#  Enganchar CLI por zona (Users; luego Clients, LastUpdate, etc.)
# --------------------------------------------------------------------
from .zones.users.cli import users as users_group  # noqa: E402

cli.add_command(users_group)


if __name__ == "__main__":
    cli()
