# 1. Cargar libreras necesarias
library(lidR)
library(terra)

# 2. Definir rutas (Origen mltiple y Destino nico)
carpetas_origen <- c(
  "P:/Cartografia/02_Altimetria/023_LIDAR/2025/Todos0",
  "P:/Cartografia/02_Altimetria/023_LIDAR/2025/Todos1",
  "P:/Cartografia/02_Altimetria/023_LIDAR/2025/Todos2"
)
ruta_salida <- "P:/Cartografia/02_Altimetria/023_LIDAR/Resultados"

# Crear la carpeta de resultados si no existe
if(!dir.exists(ruta_salida)) {
  dir.create(ruta_salida, recursive = TRUE)
}

# 3. Crear el catlogo continuo y aplicar configuracin
# Lee las 3 carpetas a la vez para procesar los datos por bloques[cite: 1]
ctg <- readLAScatalog(carpetas_origen)

# Filtramos para quedarnos solo con el suelo (2) y quitar solapes[cite: 1]
opt_filter(ctg) <- "-keep_class 2 -drop_overlap"

# 4. LECTURA ANTIBALAS DEL ARCHIVO CSV
# Leemos el archivo asegurando que el separador es el punto y coma
hojas_25k <- read.csv("25k.csv", sep = ";", strip.white = TRUE) 

# Obligamos a R a renombrar las columnas para evitar caracteres invisibles
colnames(hojas_25k) <- c("X_min", "Y_min", "X_max", "Y_max", "HOJA25K")

cat("Se van a procesar", nrow(hojas_25k), "hojas cartogrficas.\n\n")

# 5. BUCLE: Procesar cada hoja del CSV
for (i in 1:nrow(hojas_25k)) {
  
  # Asignamos las variables (ahora es 100% seguro que R las encontrar)
  nombre_hoja <- hojas_25k$HOJA25K[i] 
  xmin <- hojas_25k$X_min[i]
  ymin <- hojas_25k$Y_min[i]
  xmax <- hojas_25k$X_max[i]
  ymax <- hojas_25k$Y_max[i]
  
  cat("-> Recortando y procesando hoja:", nombre_hoja, "...\n")
  
  # A. Recortar el rea de la hoja CON UN BFER DE 20 METROS
  # Cogemos puntos extra para que los algoritmos calculen bien los bordes
  las_hoja <- clip_rectangle(ctg, 
                             xleft = xmin - 20, ybottom = ymin - 20, 
                             xright = xmax + 20, ytop = ymax + 20)
  
  # Si en esas coordenadas no hay datos LiDAR, saltamos a la siguiente hoja
  if (is.empty(las_hoja)) {
    cat("   [Aviso] No hay datos en esta extensin. Saltando...\n")
    next
  }
  
  # B. Crear MDT y suavizar
  mdt_base <- rasterize_terrain(las_hoja, res = 2, algorithm = tin())
  ventana_suavizado <- matrix(1, nrow = 3, ncol = 3)
  mdt_suavizado <- focal(mdt_base, w = ventana_suavizado, fun = median, na.rm = TRUE)
  
  # C. Recortar el raster a la medida EXACTA de la hoja (eliminando el bfer)
  extension_exacta <- ext(xmin, xmax, ymin, ymax)
  mdt_final <- crop(mdt_suavizado, extension_exacta)
  
  # D. Guardar el archivo definitivo en la carpeta Resultados
  archivo_salida <- file.path(ruta_salida, paste0(nombre_hoja, "_MDT_25k.tif"))
  writeRaster(mdt_final, filename = archivo_salida, overwrite = TRUE)
  cat("   [OK] Guardado en:", archivo_salida, "\n\n")
  
  # Liberar memoria RAM antes de pasar a la siguiente hoja
  rm(las_hoja, mdt_base, mdt_suavizado, mdt_final)
  gc()
}

cat("\nTODAS LAS HOJAS 25K HAN SIDO PROCESADAS PERFECTAMENTE!\n")
