#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
consulta_cliente_felix.py
==========================
Script de DIAGNOSTICO. Consulta la API de Felix (solo lectura, GET) y
muestra el JSON COMPLETO de un cliente concreto, sin recortar ningun
campo. No modifica nada, no manda nada a Telegram, no toca los
ficheros de estado del bot.

POR QUE EXISTE:
Antes de tocar la logica de deteccion de LOS en bot_felix.py, hace
falta ver TODOS los campos que Felix trae de verdad para un cliente
(por si hay un campo propio de LOS/alarma que el bot no este leyendo
todavia), en vez de asumir la forma del JSON.

REQUISITO:
Tiene que estar en la MISMA CARPETA que bot_felix.py, porque reutiliza
de ahi mismo la lista REDES y la funcion consultar_felix(), para
consultar exactamente con la misma autenticacion y verificacion SSL
que usa el bot (no reinventamos eso aqui).

Si en el servidor el fichero del bot se llama "telegram_los_bot.py" en
vez de "bot_felix.py" (aparece asi en un par de comentarios del propio
bot), cambia el import de abajo por:
    from telegram_los_bot import REDES, consultar_felix, CUSTOMER_ENDPOINT

USO:
    python3 consulta_cliente_felix.py <numero_de_cliente>
    python3 consulta_cliente_felix.py <nombre_o_apellido>
    python3 consulta_cliente_felix.py <numero_de_cliente> <nombre>

    Con varios argumentos, TODOS tienen que aparecer en el cliente (es
    un AND), asi que pasar numero + nombre a la vez afina mas que
    pasar solo uno de los dos.

    Para limitar la busqueda a una sola red (mas rapido si ya sabes
    cual es), pon el slug de la red primero:
        python3 consulta_cliente_felix.py moron <numero_o_nombre>
        (slugs disponibles: moron, fiberalg, fiberplus)

La busqueda es case-insensitive y mira dentro de TODO el JSON del
cliente (no solo full_name), asi que encuentra el numero de cliente
aunque el campo no se llame igual que en vuestro sistema de facturacion.
"""

import json
import sys

try:
    from bot_felix import REDES, consultar_felix, CUSTOMER_ENDPOINT
except ImportError:
    sys.exit(
        "No se pudo importar bot_felix.py.\n"
        "Este script tiene que estar en la misma carpeta que bot_felix.py.\n"
        "Si el bot se llama distinto en este servidor (p.ej. "
        "telegram_los_bot.py), cambia la linea del 'import' arriba del "
        "todo de este fichero."
    )


def buscar_cliente(terminos, slugs_filtro=None):
    """
    Devuelve una lista de (nombre_red, cliente_json) para los clientes
    en los que TODOS los 'terminos' aparecen en algun sitio del JSON
    (busqueda de texto simple, case-insensitive, sin depender de saber
    el nombre exacto del campo del numero de cliente).
    """
    terminos = [t.strip().lower() for t in terminos if t.strip()]
    encontrados = []

    for red in REDES:
        if slugs_filtro and red["slug"] not in slugs_filtro:
            continue

        print("--- Consultando red: {} ---".format(red["nombre"]), file=sys.stderr)
        try:
            data = consultar_felix(red, CUSTOMER_ENDPOINT)
        except Exception as e:
            print("    ERROR consultando esta red: {}".format(e), file=sys.stderr)
            continue

        print("    {} clientes recibidos de Felix.".format(len(data)), file=sys.stderr)

        for cliente in data:
            texto = json.dumps(cliente, ensure_ascii=False).lower()
            if all(t in texto for t in terminos):
                encontrados.append((red["nombre"], cliente))

    return encontrados


if __name__ == "__main__":
    args = sys.argv[1:]
    if not args:
        sys.exit(
            "Uso: python3 consulta_cliente_felix.py [red_slug] "
            "<numero_de_cliente_y/o_nombre>"
        )

    slugs_validos = {red["slug"] for red in REDES}
    if args[0] in slugs_validos and len(args) > 1:
        slugs_filtro = {args[0]}
        terminos_busqueda = args[1:]
    else:
        slugs_filtro = None
        terminos_busqueda = args

    resultados = buscar_cliente(terminos_busqueda, slugs_filtro)

    if not resultados:
        print(
            "\nNo se encontro ningun cliente que coincida con: {}".format(
                " ".join(terminos_busqueda)
            )
        )
        sys.exit(0)

    print("\nEncontrados {} resultado(s):\n".format(len(resultados)))
    for nombre_red, cliente in resultados:
        print("=== Red: {} ===".format(nombre_red))
        print(json.dumps(cliente, indent=2, ensure_ascii=False))
        print()
