import os
import subprocess
from concurrent.futures import ThreadPoolExecutor

# --- RUTAS DE TRABAJO CORREGIDAS ---
directorio_base = r"P:\Cartografia\02_Altimetria\023_LIDAR\2025"
directorio_vrt = r"P:\Cartografia\02_Altimetria\023_LIDAR\2025\68Bandas" # <--- Ruta correcta
archivo_coordenadas = os.path.join(directorio_base, "Hojas50k.txt")
archivo_vrt_global = os.path.join(directorio_vrt, "mosaico_globar.vrt")   # <--- Apuntando a 68Bandas

# Parámetros espaciales
epsg = "EPSG:25830"
resolucion = "10 10"
valor_nodata = "-9999"

# 2 NÚCLEOS para evitar colapsar el disco duro
nucleos_procesamiento = 2 

def procesar_hoja_50k(linea):
    try:
        if not linea.strip():
            return
            
        linea_limpia = linea.replace(";", " ").replace(",", " ").strip()
        partes = linea_limpia.split()
        
        if len(partes) != 5:
            return
            
        nombre = partes[0]
        if nombre.lower() in ["nombre", "hoja", "id"]:
            return
            
        xi, yi, xs, ys = partes[1], partes[2], partes[3], partes[4]
        archivo_salida = os.path.join(directorio_base, f"{nombre}.IMG")
        
        projwin = [xi, ys, xs, yi]
        
        if os.path.exists(archivo_salida):
            print(f"[-] Saltando {nombre}.IMG (ya existe)...")
            return

        # Comandos limpios solo con opciones compatibles con .IMG (HFA)
        comando_translate = [
            "gdal_translate",
            "--config", "GDAL_CACHEMAX", "1024", 
            "-of", "HFA",
            "-a_srs", epsg,
            "-projwin", *projwin,
            "-tr", *resolucion.split(),
            "-a_nodata", valor_nodata,
            "-co", "USE_SPILL=YES", # Vuelca a disco si el archivo es gigante para no saturar RAM
            archivo_vrt_global,
            archivo_salida
        ]
        
        print(f"-> [{nombre}] Extrayendo y procesando mosaico...")
        
        proceso = subprocess.run(
            comando_translate, 
            check=True, 
            stdout=subprocess.DEVNULL, 
            stderr=subprocess.PIPE, 
            text=True
        )
        print(f"==> ÉXITO: {nombre}.IMG generado correctamente.")
        
    except subprocess.CalledProcessError as e:
        print(f"\n[x] ERROR CRÍTICO en hoja {nombre}. Motivo de GDAL:")
        print(f"    {e.stderr.strip()}\n")
    except Exception as e:
        print(f"[x] ERROR INTERNO en Python con la línea '{linea.strip()}': {e}")

# Ejecución principal
if not os.path.exists(archivo_vrt_global):
    print(f"ERROR: No se encuentra el VRT maestro en {archivo_vrt_global}")
    exit()

if not os.path.exists(archivo_coordenadas):
    print(f"ERROR: No se encuentra el archivo de hojas en {archivo_coordenadas}")
    exit()

print(f"Leyendo hojas de corte desde: {archivo_coordenadas}")
with open(archivo_coordenadas, "r") as f:
    lineas = f.readlines()

print(f"Iniciando procesado ESTABLE con {nucleos_procesamiento} cores...\n")

with ThreadPoolExecutor(max_workers=nucleos_procesamiento) as executor:
    executor.map(procesar_hoja_50k, lineas)

print("\n=== PROCESAMIENTO DE HOJAS 50K FINALIZADO ===")