import os
import subprocess
import glob

# Rutas principales
directorio = r"P:\Cartografia\02_Altimetria\023_LIDAR\2025\68Bandas"
archivo_coordenadas = os.path.join(directorio, "HOjas_laz.txt")
lista_archivos_txt = os.path.join(directorio, "lista_archivos.txt")
archivo_vrt = os.path.join(directorio, "mosaico_global.vrt")

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

# 1. Crear la lista de archivos TIF y generar el Raster Virtual (VRT) global
print("Localizando archivos .tif y generando VRT...")
archivos_tif = glob.glob(os.path.join(directorio, "PNOA*.tif"))

with open(lista_archivos_txt, "w") as f:
    for tif in archivos_tif:
        f.write(f"{tif}\n")

comando_vrt = [
    "gdalbuildvrt",
    "-vrtnodata", valor_nodata,
    "-input_file_list", lista_archivos_txt,
    archivo_vrt
]
subprocess.run(comando_vrt, check=True)

# 2. Leer el archivo de coordenadas HOjas_laz.txt
print(f"Leyendo archivo de coordenadas: {archivo_coordenadas}")
with open(archivo_coordenadas, "r") as f:
    lineas = f.readlines()

# 3. Procesar la extracción de cada mosaico
for linea in lineas:
    if not linea.strip():
        continue
        
    # Limpiar la línea reemplazando los puntos y comas por espacios para extraer las 5 variables
    linea_limpia = linea.replace(";", " ").split()
    
    if len(linea_limpia) != 5:
        print(f"Ignorando línea por formato incorrecto: {linea.strip()}")
        continue
        
    nombre = linea_limpia[0]
    xi = linea_limpia[1] # X mínimo (Inferior Izquierda)
    yi = linea_limpia[2] # Y mínimo (Inferior Izquierda)
    xs = linea_limpia[3] # X máximo (Superior Derecha)
    ys = linea_limpia[4] # Y máximo (Superior Derecha)
    
    archivo_salida = os.path.join(directorio, f"{nombre}.IMG")
    
    # gdal_translate exige -projwin en orden: X_mínimo, Y_máximo, X_máximo, Y_mínimo
    projwin = [xi, ys, xs, yi]
    
    comando_translate = [
        "gdal_translate",
        "-of", "HFA",
        "-a_srs", epsg,
        "-projwin", *projwin,
        "-tr", *resolucion.split(),
        "-a_nodata", valor_nodata,
        "-co", "COMPRESSED=YES",
        archivo_vrt,
        archivo_salida
    ]
    
    print(f"Generando mosaico {nombre}.IMG (Coordenadas projwin: {projwin})...")
    try:
        subprocess.run(comando_translate, check=True)
        print(f"--> ÉXITO: {nombre}.IMG finalizado.")
    except subprocess.CalledProcessError:
        print(f"--> ERROR: Fallo al procesar el mosaico {nombre}.")

print("\n=== PROCESAMIENTO POR LOTES FINALIZADO ===")