"""
Consulta los batches pendientes en la DB, descarga el output cuando están listos
y actualiza el estado.

Uso:
    python consultar_batch.py

Variables de entorno requeridas:
    APIKEY_CHATGPT, PATH_BATCH_OUTPUT,
    SERVER_D, DATABASE_D, USERNAME_D, PASSWORD_D
"""

import logging
import os
import pathlib
import socket
import sys

sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))

from dotenv import load_dotenv

import helpers.db as db
import procesamiento.batch_openai.openai_client as openai_client
from helpers.logging_setup import setup_logging, setup_logging_db

load_dotenv()
_run_id = setup_logging("consultar_batch")

ID_PROCESO = int(os.getenv("ID_PROCESO_CONSULTAR_BATCH", 0))


def _s(valor):
    return str(valor).replace('\n', ' ').replace('\r', ' ')


def consultar_batches():
    api_key = os.getenv("APIKEY_CHATGPT")
    if not api_key:
        raise ValueError("APIKEY_CHATGPT no está definida en las variables de entorno.")

    directorio_output = os.getenv("PATH_BATCH_OUTPUT")
    if not directorio_output:
        raise ValueError("PATH_BATCH_OUTPUT no está definida en las variables de entorno.")

    pendientes = db.ejecutar_sp('gestor_batch_procesos', ['GET_PENDIENTES'])
    if not pendientes:
        return logging.warning("No hay batches pendientes")

    logging.info(f"Batches pendientes: {len(pendientes)}")

    ok_count = 0
    error_count = 0

    for item in pendientes:
        batch_id = item['batch_id']
        logging.info(f"Consultando batch: {_s(batch_id)}")

        try:
            info = openai_client.consultar_batch(batch_id, api_key)
        except Exception as e:
            logging.error(f"Error consultando batch {_s(batch_id)}: {e}")
            error_count += 1
            continue

        if info.get("output_file_id"):
            try:
                ruta = openai_client.descargar_output(info["output_file_id"], api_key, directorio_output)
                logging.info(f"Output descargado: {ruta}")
            except Exception as e:
                logging.error(f"Error descargando output del batch {_s(batch_id)}: {e}")
                error_count += 1
                continue

            db.ejecutar_sp('gestor_batch_procesos', [
                'UPDATE_ESTADO', item['id'], None, None,
                info["status"], None, None, None, None, None, None,
            ])
            logging.info(f"Batch {_s(batch_id)} completado y actualizado")
            ok_count += 1
        else:
            logging.info(f"Batch {_s(batch_id)} en estado: {_s(info.get('status'))}")
            ok_count += 1

    return len(pendientes), ok_count, error_count


if __name__ == "__main__":
    logging.info("Inicio del proceso")

    id_log = None
    try:
        result = db.ejecutar_sp('PRS_iniciar', [
            ID_PROCESO,
            socket.gethostbyname(socket.gethostname()),
            os.getpid(),
            socket.gethostname(),
            12,
            _run_id,
        ])
        if result:
            id_log = result[0].get('id_log')
            setup_logging_db(id_log)
    except Exception as e:
        logging.warning(f"PRS_iniciar falló: {e}")

    total = ok_count = error_count = 0
    try:
        resultado = consultar_batches()
        if resultado:
            total, ok_count, error_count = resultado
    except Exception as e:
        error_count = 1
        logging.error(f"Error en consultar_batches: {e}")
    finally:
        if id_log is not None:
            try:
                db.ejecutar_sp('PRS_finalizar', [id_log, None, total, ok_count, error_count])
            except Exception as e:
                logging.warning(f"PRS_finalizar falló: {e}")
