"""Punto de entrada para ingestar oportunidades y procesar el lote pendiente."""

from __future__ import annotations

import argparse
import json
import logging
import sys
from pathlib import Path

from controllers.ingest_controller import recibir_oportunidades_raw
from controllers.process_controller import procesar_lote_pendiente

logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s | %(levelname)s | %(message)s",
    datefmt="%Y-%m-%d %H:%M:%S",
)
logger = logging.getLogger("oportunidades")


def _cargar_entrada(ruta: str | None, raw_json: str | None) -> dict:
    if raw_json:
        return json.loads(raw_json)
    if ruta:
        with Path(ruta).open("r", encoding="utf-8") as archivo:
            return json.load(archivo)
    raise ValueError("Debe indicar --archivo o --json para la ingesta.")


def _menu_interactivo() -> None:
    print("\n=== Procesador de Oportunidades ===")
    print("1) Ingestar lote (archivo JSON o lista de oportunidades)")
    print("2) Procesar lote pendiente")
    print("3) Ingestar y procesar en secuencia")
    print("0) Salir")

    opcion = input("\nSeleccione una opción: ").strip()

    if opcion == "1":
        _flujo_ingesta()
    elif opcion == "2":
        procesar_lote_pendiente()
    elif opcion == "3":
        _flujo_ingesta()
        procesar_lote_pendiente()
    elif opcion == "0":
        print("Hasta luego.")
        return
    else:
        print("Opción no válida.")


def _flujo_ingesta() -> None:
    ruta = input("Ruta del JSON de entrada (Enter para pegar JSON): ").strip()
    if ruta:
        payload = _cargar_entrada(ruta, None)
    else:
        print("Pegue el JSON y termine con una línea vacía:")
        lineas: list[str] = []
        while True:
            linea = sys.stdin.readline()
            if not linea or linea.strip() == "":
                break
            lineas.append(linea)
        payload = json.loads("".join(lineas))

    resultado = recibir_oportunidades_raw(payload)
    print(f"Ingestadas {len(resultado['pendientes'])} oportunidades en storage/no_iniciados/lote.json")


def main() -> None:
    parser = argparse.ArgumentParser(
        description="Ingesta y procesamiento masivo de oportunidades."
    )
    parser.add_argument(
        "--ingestar",
        action="store_true",
        help="Guarda el lote en storage/no_iniciados/lote.json",
    )
    parser.add_argument(
        "--procesar",
        action="store_true",
        help="Procesa el lote pendiente y genera el resumen consolidado",
    )
    parser.add_argument(
        "--archivo",
        help="Ruta a un JSON con {\"oportunidades\": [...]}",
    )
    parser.add_argument(
        "--json",
        dest="raw_json",
        help="JSON crudo de oportunidades (string)",
    )

    args = parser.parse_args()

    if not args.ingestar and not args.procesar:
        _menu_interactivo()
        return

    if args.ingestar:
        payload = _cargar_entrada(args.archivo, args.raw_json)
        resultado = recibir_oportunidades_raw(payload)
        logger.info("Ingestadas %s oportunidades", len(resultado["pendientes"]))

    if args.procesar:
        procesar_lote_pendiente()


if __name__ == "__main__":
    main()
