import os
import sys
import logging
import subprocess
from concurrent.futures import ThreadPoolExecutor, as_completed

# --- AUTO-INSTALADOR ---
def install_missing():
    try:
        import pandas
        import requests
        import openpyxl
        import tqdm
    except ImportError:
        subprocess.check_call([sys.executable, "-m", "pip", "install", "pandas", "requests", "openpyxl", "tqdm", "-q"])

install_missing()

import pandas as pd
import requests
from tqdm import tqdm

# --- LOGGING ---
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s [%(levelname)s] %(message)s',
    handlers=[logging.FileHandler("reproceso_errores.log", encoding='utf-8'), logging.StreamHandler(sys.stdout)]
)
logger = logging.getLogger(__name__)

# --- CONFIGURACIÓN ---
FILE_INPUT = 'CHK-IDMERIT_PhoneCheck_AR_POC_20260203_PROCESSED.xlsx' # Archivo ya procesado con errores
FILE_OUTPUT = 'CHK-IDMERIT_PhoneCheck_AR_POC_20260203_FIXED.xlsx'
API_URL = "https://api.fidelitas.com.ar/v3/telephone"
API_KEY = "WF6ABLD8J93EURIOPZK7"
COL_PHONE = "National Phone Number" # Columna H
COL_TAXID = "TAXID"                # Columna I (donde están los errores)
COL_NOMBRE = "NOMBRE_API"          # Columna J
MAX_WORKERS = 3 # Podemos subirlo un poco para el reproceso


def process_api_sanitized(row_data):
    """
    Misma lógica de consulta, pero aplicada solo a los fallidos.
    """
    index, phone = row_data
    phone_clean = str(phone).split('.')[0].replace(' ', '').strip()

    try:
        payload = {'apikey': API_KEY, 'phone': phone_clean}
        res = requests.post(API_URL, data=payload, timeout=20) # Aumentamos timeout por si la API está lenta

        if res.status_code != 200:
            return index, f"HTTP_{res.status_code}", "", 0

        data = res.json()
        items = data.get('response', [])
        if not isinstance(items, list):
            items = [items] if items else []

        cuits_unicos = set()
        nombres_unicos = set()
        blacklist = ["CLARO", "ERROR PROCESS", "NONE", "NULL", "ERROR_PROCESS"]

        for i in items:
            if isinstance(i, dict):
                raw_cuit = str(i.get('cuit', '')).replace('-', '').strip()
                raw_nombre = str(i.get('nombre', '')).strip().upper()
                if raw_cuit and raw_cuit not in blacklist and raw_cuit.isdigit():
                    cuits_unicos.add(raw_cuit)
                if raw_nombre and raw_nombre not in blacklist and raw_nombre != "":
                    nombres_unicos.add(raw_nombre)

        return index, "/".join(sorted(list(cuits_unicos))), "/".join(sorted(list(nombres_unicos))), len(items)

    except Exception as e:
        return index, "ERROR_API", str(e), 0

def main():
    if not os.path.exists(FILE_INPUT):
        logger.error(f"❌ No se encontró el archivo de entrada: {FILE_INPUT}")
        return

    logger.info(f"📂 Cargando planilla para reproceso: {FILE_INPUT}")
    df = pd.read_excel(FILE_INPUT)

    # Identificar registros que necesitan reproceso
    # Filtramos donde TAXID sea exactamente 'ERROR_API'
    mask_errores = df[COL_TAXID].astype(str).str.contains("ERROR_API", na=False)
    df_to_fix = df[mask_errores]

    total_a_reparar = len(df_to_fix)

    if total_a_reparar == 0:
        logger.info("✅ No se encontraron registros con 'ERROR_API'. Nada que hacer.")
        return

    logger.info(f"🔎 Se encontraron {total_a_reparar} registros para reintentar.")

    tasks = [(i, row[COL_PHONE]) for i, row in df_to_fix.iterrows()]

    exitos_nuevos = 0

    with ThreadPoolExecutor(max_workers=MAX_WORKERS) as executor:
        futures = [executor.submit(process_api_sanitized, task) for task in tasks]

        for future in tqdm(as_completed(futures), total=total_a_reparar, desc="Reparando errores"):
            idx, taxid, nombre, _ = future.result()

            # Solo actualizamos si el nuevo resultado no es un error
            # O puedes decidir sobrescribir de todos modos para ver si el mensaje de error cambió
            df.at[idx, COL_TAXID] = taxid
            df.at[idx, COL_NOMBRE] = nombre

            if taxid and not any(x in str(taxid) for x in ["HTTP", "ERROR"]):
                exitos_nuevos += 1

    # Guardar cambios
    df.to_excel(FILE_OUTPUT, index=False)

    print("\n" + "═"*50)
    print("🛠️ RESUMEN DE REPARACIÓN")
    print("═"*50)
    print(f"🔄 Registros reintentados:    {total_a_reparar}")
    print(f"✨ Errores corregidos:        {exitos_nuevos}")
    print(f"⚠️ Siguen con error:          {total_a_reparar - exitos_nuevos}")
    print(f"💾 Guardado en:               {FILE_OUTPUT}")
    print("═"*50)

if __name__ == "__main__":
    main()