import sqlite3
import pandas as pd
from sodapy import Socrata
import datetime

DATASET_ID = "p6dx-8zbt"

def cargar_baul_tesoros_inicial():
    """Carga inicial de respaldo para tener datos con los que promediar generalidades"""
    client = Socrata("www.datos.gov.co", None)
    print(f"[{datetime.datetime.now()}] Proycol: Verificando Baúl de los Tesoros Base...")
    try:
        where_query = (
            "estado_del_procedimiento = 'Seleccionado' "
            "AND fecha_de_publicacion_del >= '2025-08-01T00:00:00.000' "
            "AND fecha_de_publicacion_del <= '2025-10-31T23:59:59.000'"
        )
        results = client.get(DATASET_ID, where=where_query, limit=100, order="fecha_de_publicacion_del DESC")
        if results:
            df = pd.DataFrame.from_records(results)
            for col in df.columns:
                if df[col].apply(lambda x: isinstance(x, (list, dict))).any():
                    df[col] = df[col].astype(str)
            conn = sqlite3.connect('proycol_consultor.db')
            df.to_sql('proyectos_ganadores', conn, if_exists='replace', index=False)
            conn.close()
            print("Baúl base verificado con éxito.")
    except Exception as e:
        print(f"Error en carga inicial: {e}")

def obtener_historico_en_vivo(nit_entidad):
    """
    CONECTOR DINÁMICO: Si el NIT no existe localmente, consulta en vivo 
    el SECOP II para esa entidad específica en el trimestre estratégico.
    """
    client = Socrata("www.datos.gov.co", None)
    print(f"[{datetime.datetime.now()}] Proycol: NIT no encontrado localmente. Consultando API en vivo para NIT {nit_entidad}...")
    
    try:
        # Filtro estricto por NIT del nuevo cliente/entidad y ventana temporal de éxito
        where_query = (
            f"nit_entidad = '{nit_entidad}' "
            "AND estado_del_procedimiento = 'Seleccionado' "
            "AND fecha_de_publicacion_del >= '2025-08-01T00:00:00.000' "
            "AND fecha_de_publicacion_del <= '2025-10-31T23:59:59.000'"
        )
        
        results = client.get(DATASET_ID, where=where_query, limit=50)
        
        if not results:
            print(f"No se encontraron contratos históricos para el NIT {nit_entidad} en el trimestre seleccionado. Se usará el promedio regional.")
            return False
            
        df_nuevo = pd.DataFrame.from_records(results)
        
        # Limpieza obligatoria de tipos complejos
        for col in df_nuevo.columns:
            if df_nuevo[col].apply(lambda x: isinstance(x, (list, dict))).any():
                df_nuevo[col] = df_nuevo[col].astype(str)
                
        # Insertar los nuevos datos sin borrar los anteriores (if_exists='append')
        conn = sqlite3.connect('proycol_consultor.db')
        df_nuevo.to_sql('proyectos_ganadores', conn, if_exists='append', index=False)
        conn.close()
        print(f"[{datetime.datetime.now()}] Éxito: {len(df_nuevo)} registros indexados dinámicamente para el NIT {nit_entidad}.")
        return True
        
    except Exception as e:
        print(f"Error en la consulta dinámica del API: {e}")
        return False

if __name__ == "__main__":
    cargar_baul_tesoros_inicial()
