# ==============================================================================
  #                 ACTUALIZACIÓN DE LIQUIDEZ - CORREGIDO
  #                          31/12/2025
  # ==============================================================================
  #                          CARGA DE LIBRERIAS
  # ==============================================================================
  rm(list = ls())

  paquetes <- c("mailR","odbc", "dplyr","glue", "base64enc","httr",
                "jsonlite","scales", "openxlsx", "lubridate")
  
  for (pkg in paquetes) {
    if (!requireNamespace(pkg, quietly = TRUE)) {
      message("Instalando paquete: ", pkg)
      tryCatch({
        install.packages(pkg, dependencies = TRUE, repos = "https://cloud.r-project.org")
      }, error = function(e) {
        message("❌ Error instalando ", pkg, ": ", e$message)
      })
    }
    library(pkg, character.only = TRUE)
  }
  
  # ==============================================================================
  #                CAPTURA DE ARGUMENTOS (MODO + MES + AÑO)
  # ==============================================================================
  
  args <- commandArgs(trailingOnly = TRUE)
  
  meses_esp <- c("Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", 
                 "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre")
  
  # -----------------------------
  # 1️⃣ MODO con_pre / sin_pre
  # -----------------------------
  modo_input <- ifelse(length(args) >= 1, tolower(trimws(args[1])), "sin_pre")
  
  if (!modo_input %in% c("con_pre", "sin_pre")) {
    stop("❌ Primer argumento inválido. Use 'con_pre' o 'sin_pre'")
  }
  
  incluir_preregistro <- (modo_input == "con_pre")
  sufijo_pre <- modo_input
  
  message("✅ MODO ACTIVO:", sufijo_pre)
  
  # -----------------------------
  # 2️⃣ MES (opcional)
  # -----------------------------
  if (length(args) >= 2) {
    
    mes_input <- trimws(args[2])
    
    if (grepl("^[0-9]+$", mes_input)) {
      
      num_mes <- as.numeric(mes_input)
      
      if (num_mes < 1 || num_mes > 12) {
        stop("❌ Número de mes inválido (1-12).")
      }
      
    } else {
      
      mes_input_cap <- tools::toTitleCase(tolower(mes_input))
      
      if (!mes_input_cap %in% meses_esp) {
        stop("❌ Nombre de mes inválido.")
      }
      
      num_mes <- match(mes_input_cap, meses_esp)
    }
    
  } else {
    
    num_mes <- as.numeric(format(Sys.Date(), "%m"))
  }
  
  mes_actual <- meses_esp[num_mes]
  
  # -----------------------------
  # 3️⃣ AÑO (opcional)
  # -----------------------------
  if (length(args) >= 3) {
    
    anio_input <- as.numeric(args[3])
    
    if (is.na(anio_input) || anio_input < 2020 || anio_input > 2100) {
      stop("❌ Año inválido.")
    }
    
    anio_actual <- anio_input
    
  } else {
    
    anio_actual <- as.numeric(format(Sys.Date(), "%Y"))
  }
  
  message("📅 PERIODO SELECCIONADO:", mes_actual, anio_actual)
  
# ==============================================================================
#                          OBTENCIÓN DE DATOS API
# ==============================================================================
  
  url <- "https://apipagotrack.mexiclientes.com/index.php?action=estimacionLiquidez"
  url_publica_base <- "https://rsie.mexiclientes.com/r_data/Reportes/Liquidez/"
  estatus_base <- c("Creado", "Turnado", "RegistradoSAP", "Remesa", 
                    "RemesaAprobada", "Observaciones", "Devuelto", "Rechazado")
  
  estatus_final <- if (incluir_preregistro) {
    message("ℹ️ REPORTE TIPO: COMPLETO (Con PreRegistro)")
    c("PreRegistro", estatus_base)
  } else {
    message("ℹ️ REPORTE TIPO: ESTÁNDAR (Sin PreRegistro)")
    estatus_base
  }
  
  datos <- list(
    mes = mes_actual,
    anio = anio_actual,
    estatus = estatus_final,
    tipoTramite = c("OP", "OPO", "SRF")
  )
  
  message("📡 Conectando a la API para:", mes_actual, anio_actual)
  
  respuesta <- tryCatch({
    POST(
      url,
      body = toJSON(datos, auto_unbox = TRUE),
      encode = "json",
      content_type_json(),
      timeout(60)
    )
  }, error = function(e) {
    stop("❌ Error en conexión con API: ", e$message)
  })
  
  codigo_estatus <- status_code(respuesta)
  contenido_texto <- content(respuesta, "text", encoding = "UTF-8")
  
  if (codigo_estatus == 200) {
    
    message("✅ API respondió correctamente (200). Procesando datos...")
    
    json_respuesta <- fromJSON(contenido_texto)
    
    if (!is.null(json_respuesta$data) && length(json_respuesta$data) > 0) {
      
      df_completo <- cbind(
        json_respuesta$data[names(json_respuesta$data) != "Fondos"],
        json_respuesta$data$Fondos
      )
      
    } else {
      message("⚠️ La API respondió 200 pero no hay datos.")
      quit(save = "no", status = 0)
    }
    
  } else if (codigo_estatus == 404 &&
             grepl("No se encontraron estimación de liquidez", contenido_texto)) {
    
    message("⚠️ No hay datos disponibles para:", mes_actual, anio_actual)
    quit(save = "no", status = 0)
    
  } else {
    
    stop("❌ Error API. Código:", codigo_estatus,
         " | Respuesta:", substr(contenido_texto, 1, 200))
  }
# ==============================================================================
# PROCESAMIENTO DE DATOS
# ==============================================================================
  options(scipen = 999) 
  
  # Copia completa antes de reducir columnas (para vista "Detalle completo")
  df_full <- df_completo
  
  df_completo <- df_completo %>%
    select(ID_CONTRATO, Secretaria, Proveedor, Concepto, Importe, F10050)%>%
    mutate(
      Importe = as.numeric(Importe),
      F10050  = as.numeric(F10050)
    )
  
  df_filtrado <- df_completo %>%
    filter(F10050 >= 1000000) %>%
    mutate(Número = row_number()) %>%
    select(Número, everything()) %>%
    arrange(desc(F10050))
  
  total_importe <- sum(df_completo$Importe, na.rm = TRUE)
  total_f10050  <- sum(df_completo$F10050,  na.rm = TRUE)
  
  filas_html <- apply(df_filtrado, 1, function(row){
    paste0(
      "<tr>",
      "<td>", row["Número"], "</td>",
      "<td>", row["ID_CONTRATO"], "</td>", 
      "<td>", row["Secretaria"], "</td>", 
      "<td>", row["Proveedor"], "</td>", 
      "<td style='text-align: justify;'>", row["Concepto"], "</td>",
      "<td>$", format(as.numeric(row["Importe"]), big.mark = ",", decimal.mark = ".", nsmall = 2), "</td>",
      "<td>$", format(as.numeric(row["F10050"]), big.mark = ",", decimal.mark = ".", nsmall = 2), "</td>",
      "</tr>"
    )
  })
  
  fila_total <- paste0(
    "<tr class='total-row'>",
    "<td colspan='5' style='text-align:right;'>TOTALES</td>",
    "<td>$", format(total_importe, big.mark = ",", nsmall = 2), "</td>",
    "<td>$", format(total_f10050, big.mark = ",", nsmall = 2), "</td>",
    "</tr>"
  )
  cuerpo_tabla <- paste(paste(filas_html, collapse = "\n"))
  cuerpo_total <- paste(fila_total, sep = "\n")
  
  # ==========================================================
  #                       RESUMEN DE FONDOS
  # ========================================================
  df_solo_fondos <- json_respuesta$data$Fondos
  totales_vector <- colSums(df_solo_fondos, na.rm = TRUE)
  
  resumen_fondos <- data.frame(
    FONDO = names(totales_vector),
    MONTO = as.numeric(totales_vector)
  ) %>%
    arrange(desc(MONTO))
  
  gran_total_valor <- sum(resumen_fondos$MONTO, na.rm = TRUE)
  
  resumen_fondos <- resumen_fondos %>%
    bind_rows(data.frame(FONDO = "TOTAL", MONTO = gran_total_valor)) %>%
    mutate(IMPORTE = dollar(MONTO, accuracy = 0.01, prefix = "$")) %>%
    select(FONDO, IMPORTE)
  
  filas_resumen_html <- apply(resumen_fondos, 1, function(row) {
    clase_fila <- ifelse(row["FONDO"] == "TOTAL", "class='total-row'", "")
    paste0("<tr ", clase_fila, "><td>", row["FONDO"], "</td><td>", row["IMPORTE"], "</td></tr>")
  })
  tabla_resumen_html <- paste(filas_resumen_html, collapse = "\n")
  
  # ========================================================
  #              DETALLE COMPLETO DE LIQUIDEZ
  # ========================================================
  cols_detalle <- c("ID_CONTRATO","Secretaria","Proveedor","Concepto","Estatus",
                    "Mes","TipoTramite","Analista","Importe",
                    "F10050","F10125","F10126","F10329")
  cols_existentes <- intersect(cols_detalle, names(df_full))
  
  df_detalle <- df_full %>%
    select(all_of(cols_existentes)) %>%
    mutate(across(any_of(c("Importe","F10050","F10125","F10126","F10329")),
                  ~ as.numeric(.))) %>%
    arrange(desc(Importe)) %>%
    mutate(Número = row_number()) %>%
    select(Número, everything())
  
  cols_numericas <- intersect(c("Importe","F10050","F10125","F10126","F10329"), names(df_detalle))
  totales_detalle <- sapply(cols_numericas, function(col) sum(df_detalle[[col]], na.rm = TRUE))
  
  fmt_money <- function(x) paste0("$", format(x, big.mark = ",", decimal.mark = ".", nsmall = 2))
  
  filas_detalle_html <- apply(df_detalle, 1, function(row){
    celdas_texto <- paste0(
      "<td>", row["Número"], "</td>",
      "<td>", row["ID_CONTRATO"], "</td>",
      "<td>", row["Secretaria"], "</td>",
      "<td>", row["Proveedor"], "</td>",
      "<td style='text-align: justify;'>", row["Concepto"], "</td>",
      "<td>", row["Estatus"], "</td>",
      "<td>", row["Mes"], "</td>",
      "<td>", row["TipoTramite"], "</td>",
      "<td>", row["Analista"], "</td>"
    )
    celdas_num <- paste0(
      sapply(cols_numericas, function(col) {
        paste0("<td style='text-align:right;'>", fmt_money(as.numeric(row[col])), "</td>")
      }),
      collapse = ""
    )
    paste0("<tr>", celdas_texto, celdas_num, "</tr>")
  })
  
  fila_total_detalle <- paste0(
    "<tr class='total-row'>",
    "<td colspan='9' style='text-align:right;'>TOTALES</td>",
    paste0(sapply(cols_numericas, function(col) {
      paste0("<td style='text-align:right;'>", fmt_money(totales_detalle[[col]]), "</td>")
    }), collapse = ""),
    "</tr>"
  )
  
  cuerpo_detalle <- paste(filas_detalle_html, collapse = "\n")
  total_detalle  <- fila_total_detalle
  
  # =========================================================
  # TRATAMIENTO DE LOGOS
  # =========================================================
  ruta_logo_puebla <- "/var/www/html/rsie/r_imagenes/logos/Logo.png"
  ruta_logo_teso   <- "/var/www/html/rsie/r_imagenes/logos/teso.png"
  
  cargar_logo_seguro <- function(ruta) {
    if (file.exists(ruta)) return(base64enc::base64encode(ruta)) else return("")
  }
  
  logo_base64 <- cargar_logo_seguro(ruta_logo_puebla)
  teso_base64 <- cargar_logo_seguro(ruta_logo_teso)
  
  img_teso_html <- if(teso_base64 != "") glue('<img src="data:image/png;base64,{teso_base64}" width="300">') else "<span></span>"
  img_logo_html <- if(logo_base64 != "") glue('<img src="data:image/png;base64,{logo_base64}" width="200">') else "<span></span>"
  
  logo_html <- glue('
  <table style="width: 100%; border: none;">
      <tr style="border: none;">
          <td style="border: none; text-align: left; vertical-align: middle;">{img_teso_html}</td>
          <td style="border: none; text-align: right; vertical-align: middle;">{img_logo_html}</td>
      </tr>
  </table>')
  
  # =========================================================
  # GENERACIÓN DE HTML FINAL
  # =========================================================
  html_final <- glue('
  <!DOCTYPE html>
  <html lang="es">
  <head>
      <meta charset="UTF-8">
      <style>
        @media print {{ .salto-pagina {{ page-break-after: always; }} }}
        thead {{
          display: table-header-group;
          page-break-inside: avoid;
        }}
        
        tfoot {{
          display: table-footer-group;
        }}
        
        tr {{
          page-break-inside: avoid;
        }}
        table {{
          page-break-inside: auto;
        }}        
        body {{ margin: 0; padding: 20px; font-family: Arial, sans-serif; }}
        .text-container {{ text-align: center; font-size: 14px; font-weight: bold; margin: 10px 0; color: #671c33 !important; }}
        table.datos {{ width: 100%; border-collapse: collapse; font-size: 10px; }}
        table.datos th {{ background-color: #671c33 !important; color: white !important; border: 1px solid #000; padding: 4px; }}
        table.datos td {{ border: 1px solid #000; padding: 4px; text-align: center; }}
        .total-row {{ background-color: #671c33 !important; font-weight: bold; color: white !important; }}
        table.datos.detalle {{ font-size: 8px; table-layout: fixed; word-wrap: break-word; }}
        table.datos.detalle td, table.datos.detalle th {{ padding: 2px; word-break: break-word; }}
      </style>
  </head>
  <body>
      <div class="container">
          {logo_html}
          <div class="header"><strong>Reporte de líquidez:</strong> {format(Sys.time(), "%d/%m/%Y %H:%M")}</div>
          <div class="header"><strong>Corresponde al mes de:</strong> {mes_actual} {anio_actual}</div>
          <div class="text-container">RESUMEN POR FONDO</div>
          <table class="datos">
              <thead><tr><th>FONDO</th><th>IMPORTE</th></tr></thead>
              <tbody>{tabla_resumen_html}</tbody>
          </table>
          <div style="page-break-before: always;"></div> 
          {logo_html}
          <div class="text-container">PRINCIPALES PENDIENTES DE PAGO CON RECURSOS PROPIOS 10050</div>
          <table class="datos">
            <thead>
              <tr>
                <th>Número</th>
                <th>ID_CONTRATO</th>
                <th>Secretaria</th>
                <th>Proveedor</th>
                <th>Concepto</th>
                <th>Importe</th>
                <th>F10050</th>
              </tr>
            </thead>
          
            <tbody>
              {cuerpo_tabla}
            </tbody>
          
            <tfoot>
              {cuerpo_total}
            </tfoot>
          </table>

          <div style="page-break-before: always;"></div>
          {logo_html}
          <div class="text-container">DETALLE COMPLETO DE LIQUIDEZ</div>
          <table class="datos detalle">
            <thead>
              <tr>
                <th>Número</th>
                <th>ID_CONTRATO</th>
                <th>Secretaria</th>
                <th>Proveedor</th>
                <th>Concepto</th>
                <th>Estatus</th>
                <th>Mes</th>
                <th>TipoTramite</th>
                <th>Analista</th>
                <th>Importe</th>
                <th>F10050</th>
                <th>F10125</th>
                <th>F10126</th>
                <th>F10329</th>
              </tr>
            </thead>
            <tbody>
              {cuerpo_detalle}
            </tbody>
            <tfoot>
              {total_detalle}
            </tfoot>
          </table>
      </div>
  </body>
  </html>')
  
  # ==============================================================================
  #            PROCESO DE LOG Y ENVÍO
  # ==============================================================================
  archivo_log_excel <- "/var/www/html/rsie/r_data/Log_Envios_Remesas_Global.xlsx"
  ruta_reportes     <- "/var/www/html/rsie/r_data/Reportes/Liquidez/"
  
  cargar_log_global <- function(ruta) {
    if (file.exists(ruta)) return(read.xlsx(ruta))
    return(data.frame(Identificador_Remesa=character(),
                      Ruta_Imagen=character(),
                      Enviado_A=character(),
                      Estado=character(),
                      Tipo_Reporte=character(),
                      Hora_Generacion = as.POSIXct(character()), 
                      Hora_Envio = as.POSIXct(character()), 
                      stringsAsFactors=F))
  }
  
  log_global <- cargar_log_global(archivo_log_excel)
  
  enviar_reporte_pdf <- function(ruta_pdf, Identificador_Remesa) {
    send.mail(from = "tesoreria.decp@ayuntamientopuebla.gob.mx", to = "agustin.martinez@ayuntamientopuebla.gob.mx",
              subject = paste("Reporte Liquidez-",Identificador_Remesa),
              body = glue("<html><body><h2 style='color: #671c33;'>Reporte de Estimación de Liquidez</h2><p>Identificador: <b>{Identificador_Remesa}</b></p></body></html>"),
              html = TRUE, attach.files = c(ruta_pdf),
              smtp = list(host.name = "smtp.office365.com", 
                          port = 587,
                          user.name = "tesoreria.decp@ayuntamientopuebla.gob.mx", 
                          passwd = "tesoP2025!!YOdta703",
                          tls = TRUE),
              authenticate = TRUE, send = TRUE)
  }
  # 1. RECONCILIACIÓN DE PENDIENTES (SIN REPETICIONES)
  archivos_en_carpeta <- list.files(ruta_reportes, pattern = "\\.pdf$", full.names = TRUE)
  if (length(archivos_en_carpeta) > 0) {
    for (pdf_path in archivos_en_carpeta) {
      id_extraido <- gsub("ReporteLiquidez-|\\.pdf", "", basename(pdf_path))
      ya_enviado <- any(log_global$Identificador_Remesa == id_extraido & log_global$Estado == "Enviado", na.rm = TRUE)
  
      if (!ya_enviado) {
        message("📩 Sincronizando pendiente: ", id_extraido)
        try({
          enviar_reporte_pdf(pdf_path, id_extraido)
          log_global <- log_global %>% filter(Identificador_Remesa != id_extraido)
          log_global <- rbind(log_global, data.frame(
            Identificador_Remesa = id_extraido,
            Ruta_Imagen = paste0(url_publica_base, basename(pdf_path)),
            Enviado_A = "agustin.martinez@ayuntamientopuebla.gob.mx",
            Estado = "Enviado",
            Tipo_Reporte = paste0("Liquidez", sufijo_pre),
            Hora_Generacion = format(file.info(pdf_path)$mtime, "%d/%m/%Y %H:%M:%S"),
            Hora_Envio = format(Sys.time(), "%d/%m/%Y %H:%M:%S"),
            stringsAsFactors = FALSE
          ))
        })
      }
    }
  }
  
  # 2. GENERACIÓN DE NUEVO REPORTE
    message("✨ Generando reporte nuevo...")
    timestamp_id <- paste0(sufijo_pre,"-",format(Sys.time(), "%d-%m-%y-%H-%M"))
    nombre_pdf <- paste0("ReporteLiquidez-", timestamp_id, ".pdf")
    ruta_final_pdf <- file.path(ruta_reportes, nombre_pdf)
    
    tryCatch({
      writeLines(as.character(html_final), "temp.html", useBytes = TRUE)
      system(paste("xvfb-run -a wkhtmltopdf -O Landscape -s A4 --enable-local-file-access temp.html", ruta_final_pdf))
      
      if (file.exists(ruta_final_pdf)) {
        enviar_reporte_pdf(ruta_final_pdf, timestamp_id)
        log_global <- rbind(log_global, data.frame(
          Identificador_Remesa = timestamp_id,
          Ruta_Imagen = paste0(url_publica_base, nombre_pdf),
          Enviado_A = "agustin.martinez@ayuntamientopuebla.gob.mx",
          Estado = "Enviado",
          Tipo_Reporte = paste0("Liquidez",sufijo_pre),
          Hora_Generacion = format(Sys.time(), "%d/%m/%Y %H:%M:%S"),
          Hora_Envio = format(Sys.time(), "%d/%m/%Y %H:%M:%S"),
          stringsAsFactors = FALSE
        ))
      }
      if (file.exists("temp.html")) file.remove("temp.html")
    }, error = function(e) message("❌ Error: ", e$message))
    
    write.xlsx(log_global, archivo_log_excel, overwrite = TRUE)