document.addEventListener("DOMContentLoaded", function() {
    // Retrieve the rowData from the session
    var rowData = sessionStorage.getItem('rowData');
    var rowDataObj = JSON.parse(rowData);
    // Log the rowDataObj to the console
    console.log(rowDataObj);
    
    //////Variables para el cálulo///
    const tasa = rowDataObj["Tasa"];
    //localStorage.setItem('tasa', tasa);
    const c = rowDataObj["Comision"];
    //localStorage.setItem('c', com);
    const monto= rowDataObj["Validación Monto Solicitado"];
    
    //localStorage.setItem('monto', monto);
    const peri = parseFloat(rowDataObj["Periodicidad"]);
   localStorage.setItem('periodo', peri);
    const plzo= parseFloat(rowDataObj["Plazo"]);
    //localStorage.setItem('plazo', plzo);
    document.getElementById("plazodecredito").textContent = plzo/30 + " meses";
    const fechai= rowDataObj["Fecha de inicio"];
    //localStorage.setItem('fechai', fechai);
    
    const options = { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' }; // Options for formatting the date
    const interestic = parseFloat(tasa);
  console.log(interestic)
  const com = parseFloat(c);
  console.log(com)
  const amount = parseFloat(monto.replace(/[\$,]/g, ""));
  document.getElementById("montominis").textContent = `$${amount.toFixed(2).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",")}`;
  console.log(amount)
  const periodo = parseFloat(peri);
  console.log("Periodo:",periodo)
  const plazo = parseFloat(plzo);
  console.log("Plazo:",plazo)

  function formatDate(fechai) {
        // Regular expression to check for "aaaa-mm-dd" format
        var regex = /^\d{4}-\d{2}-\d{2}$/;
        
        if (regex.test(fechai)) {
            // If the date is already in "aaaa-mm-dd" format, return it as is
            return fechai;
        } else {
            // Otherwise, split the date and reformat it
            var partesFecha = fechai.split("/");
            // Formar la fecha en formato "aaaa-mm-dd"
            return partesFecha[2] + "-" + partesFecha[1].padStart(2, '0') + "-" + partesFecha[0].padStart(2, '0');
        }
    }

var fecha_inicio = formatDate(fechai);

  const n = Math.floor(plazo / periodo); // Redondear hacia abajo
  console.log(n)
  localStorage.setItem('numperiodos', n);
  
  console.log (fecha_inicio)
  const amountt = 1 * amount;
  //const date = new Date();
  let comision = com * 0.01;
  let interes = interestic * 0.01 * (periodo / 360);
  console.log(interes);
  let payment = amountt * (1+comision) * interes / (1 - Math.pow(1 + interes, -n));
  
  // Utilizar el valor redondeado de n en los cálculos
  payment = amountt * (1 + comision) * interes / (1 - Math.pow(1 + interes, -n));
  let d = payment*n
  let cost = (((d/amountt-1)*100)*12)/((plazo/30)*1.16)
  
 // Vectores que utilizaremos en el loop que genera la tabla
    var hoy = new Date(fecha_inicio.replace(/-/g, '\/'));
    var fecha = [hoy.toLocaleDateString('es-ES', options)];
    var inicio = [hoy.toLocaleDateString('es-ES', options)];
  
  var periodos = [0];
  
  // Creemos una función que nos permita sumar periodos
  
  var numOfDays = periodo; // Número de días a sumar, puedes cambiarlo a lo que necesites.

  function addDays(numOfDays, date) {
    date.setDate(date.getDate() + numOfDays);
    return date.toLocaleDateString('es-ES', options);
  }
  
  function generarFechasDePago(fechainiciar, cantidadPagos, periodo) {
    const fechas = [];

    let fechaActual = new Date(fechainiciar);

    for (let i = 0; i < cantidadPagos; i++) {
        let dia;
        let ultdia;

        switch (periodo) {
            case 7: // Every Friday
                while (fechaActual.getDay() !== 5) { // While the day is not Friday
                    fechaActual.setDate(fechaActual.getDate() + 1); // Move to the next day
                }
                dia = fechaActual.getDate();
                break;
            case 5: // Every 14th and 28th day of the month
                dia = 5;
                ultdia = 20;
                break;
            case 14: // Every 14th and 28th day of the month
                dia = 14;
                ultdia = 28;
                break;
            case 15: // Every 15th and last day of the month
                dia = 15;
                ultdia = new Date(fechaActual.getFullYear(), fechaActual.getMonth() + 1, 0).getDate(); // Get last day of the month
                break;
            case 28: // Every 28th day of the month
                dia = 28;
                break;
            case 30: // Last day of the month
                dia = new Date(fechaActual.getFullYear(), fechaActual.getMonth() + 1, 0).getDate();
                break;
            default:
                throw new Error("Invalid value for periodo");
        }

        // Create the payment date
        let nuevaFechaPago = new Date(fechaActual.getFullYear(), fechaActual.getMonth(), dia);
        fechas.push(nuevaFechaPago/*.toLocaleDateString('es-ES', options)*/);

        // If 14th or 28th, add the other day
        if (periodo === 14 || periodo === 15 || periodo ===5) {
            fechas.push(new Date(fechaActual.getFullYear(), fechaActual.getMonth(), ultdia)/*.toLocaleDateString('es-ES', options)*/);
        }

        // Mover a la siguiente fecha de pago
        if (periodo === 7) {
            fechaActual.setDate(fechaActual.getDate() + 7); // Mover al próximo viernes
            // Verificar si necesitamos pasar al siguiente mes
            if (fechaActual.getMonth() !== nuevaFechaPago.getMonth()) {
                fechaActual.setDate(1); // Empezar desde el primer día del próximo mes
            }
        } else {
            fechaActual.setMonth(fechaActual.getMonth() + 1); // Mover al próximo mes
        }
    }

    return fechas;
}

// Example usage:

const fechasDePago = generarFechasDePago(fecha_inicio, n+1, periodo);
console.log(fechasDePago);



function findNearestDate(dates) {
    // Get the current date
    let currentDate = new Date();
    // Add one day to the current date
    currentDate.setDate(currentDate.getDate() + 1);
    
    // Initialize variables to store the nearest date and its difference
    var nearestDate = null;
    var nearestDifference = Infinity;
    
    // Flag to check if all dates have passed
    var allDatesPassed = true;
    
    // Loop through each date in the array
    for (var i = 0; i < dates.length; i++) {
        // Convert the date string to a Date object
        var date = new Date(dates[i]);
        
        // Calculate the difference between the current date and the date in the array
        var difference = date - currentDate;
        
        // If the difference is negative, it means the date is in the past, so we ignore it
        if (difference < 0) {
            continue;
        }
        
        // If at least one date hasn't passed, update the flag
        allDatesPassed = false;
        
        // If the current difference is smaller than the previous smallest difference, update nearest date
        if (difference < nearestDifference) {
            nearestDifference = difference;
            nearestDate = date;
        }
    }
    
    // If all dates have passed, return the last date in the array
    if (allDatesPassed) {
        return new Date(dates[dates.length - 1]);
    }
    
    // Return the nearest date
    return nearestDate;
}

// Example usage
var nearestDate = findNearestDate(fechasDePago.slice(1));
console.log("Nearest upcoming date:", nearestDate);




  // Un loopsillo de periodos y fechas. Lo separamos por obvias razones
  for (var i = 0; i <= n; i++) {
    periodos[i + 1] = periodos[i] + 1;
    fecha[i + 1] = addDays(numOfDays * (i + 1), new Date(hoy)); // Sumamos el total de días acumulados hasta el momento
  }
  fecha[0] = addDays(numOfDays * (0), new Date(hoy)); // Sumamos el total de días acumulados hasta el momento
  
  amort = [0]
  int = [0]
  saldo_inicial = [amountt*(1+comision)];
  saldo_final = [amountt*(1+comision)];
  pago = [0]
  iva = [0]
  
  function contarFechasPasadas(fechas) {
    let fechaActual = new Date();
    // Add one day to the current date
    fechaActual.setDate(fechaActual.getDate() + 1);
    let contador = 0;

    for (let i = 0; i < fechas.length; i++) {
        let fecha = new Date(fechas[i]);
        if (fecha < fechaActual) {
            contador++;
        }
    }

    return contador;
}


let fechasPasadas = parseFloat(contarFechasPasadas(fechasDePago.slice(1)));
console.log("Número de fechas pasadas: " + fechasPasadas);
localStorage.setItem( 'fechasCounter', fechasPasadas );


//Loop formato de fechas
for (var i = 0; i <= n; i++) {
    fechasDePago[i] = fechasDePago[i].toLocaleDateString('es-ES', options)
  }
fechasDePago[0] = inicio;
  //Nuestro loop con ecuaciones en diferencia
  for (i = 0; i<=n; i++){
    pago[i+1] = payment;
    int[i+1] = saldo_final[i]*interes/1.16;
    iva[i+1] = int[i+1]*0.16;
    amort[i+1] = payment - int[i+1] - iva[i+1];
    saldo_inicial[i+1] = saldo_final[i] + int[i+1] + iva[i+1];
    saldo_final[i+1] = saldo_final[i] - amort[i+1];      
      }
  //Otro loopsillo para añadir formato:    
  for (i=0; i<=n; i++){
    saldo_inicial[i+1] = saldo_inicial[i+1].toFixed(2).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
    saldo_final[i+1] = saldo_final[i+1].toFixed(2).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
    int[i+1] = int[i+1].toFixed(2).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
    iva[i+1]  = iva[i+1].toFixed(2).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
    amort[i+1]  = amort[i+1].toFixed(2).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
    pago[i+1] = pago[i+1].toFixed(2).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); 
        }    
  saldo_inicial[0] = saldo_inicial[0].toFixed(2).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
  saldo_final[0] = saldo_final[0].toFixed(2).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
  iva[0]=iva[0].toFixed(2).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",")
  int[0]=int[0].toFixed(2).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",")
  pago[0]=pago[0].toFixed(2).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",")
  amort[0]=amort[0].toFixed(2).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",")
  

  //Ahora crearemos una tabla en HTML con la anterior información
    var headers = ["Periodo",
    "Saldo Inicial", "Interés" , "I.V.A.",  "Amortización", "Pago parcial", 
    "Saldo Final", "Fecha"];
    var table = document.createElement("TABLE");  //makes a table element for the page
        
    for(var i = 0; i <= n; i++) {
        var row = table.insertRow(i);                       
        row.insertCell(0).innerHTML = periodos[i];
        row.insertCell(1).innerHTML = `$${saldo_inicial[i]}`;
        row.insertCell(2).innerHTML = `$${int[i]}`;
        row.insertCell(3).innerHTML = `$${iva[i]}`;
        row.insertCell(4).innerHTML = `$${amort[i]}`; 
        row.insertCell(5).innerHTML = `$${pago[i]}`;
        row.insertCell(6).innerHTML = `$${saldo_final[i]}`; 
        row.insertCell(7).innerHTML = fechasDePago[i];       
    }

    var header = table.createTHead();
    var headerRow = header.insertRow(0);
    for(var i = 0; i < headers.length; i++) {
        headerRow.insertCell(i).innerHTML = headers[i];
    }
    
    const myData = table
    console.log(myData.innerHTML)
    document.getElementById('tabla').innerHTML = myData.innerHTML;      
    
    var periodicidad; // Declare the variable outside the if-else chain

if (periodo == 7) {
    periodicidad = "Semanal";
} else if (periodo == 30) {
    periodicidad = "Mensual";
} else if (periodo == 15) {
    periodicidad = "Quincenal";
} else if (periodo == 14) {
    periodicidad = "Catorcenal";
} else {
    periodicidad = "Otro"; // Handle the case when none of the conditions are met
}

console.log(periodicidad);
document.getElementById("periodicidad").textContent = periodicidad;


    
    // Unpack each variable
    const nombrePF = rowDataObj["Nombre completo"];
    document.getElementById("nombre").textContent = nombrePF.replace(/\,/g, ' ');
    ///Crear ID único 
    function generateID(fullName) {
    // Split the full name into separate words
    var words = fullName.split(" ");
    var id = "";

    // Iterate through each word
    for (var i = 0; i < words.length; i++) {
            // Take the first letter of each word and add it to the ID
            id += words[i].charAt(0);
        }
    
        // Return the first three characters of the ID (if the name has less than 3 words)
        return id.slice(0, 3).toUpperCase();
    }
    
    const idinciales = generateID(nombrePF.replace(/\,/g, ' '))
    const idcounter = rowDataObj["IDcounter"];
    const idunique = idinciales + idcounter
    console.log("ID Unico", idunique)
    document.getElementById("nocontrato").textContent = idunique;
    const id = rowDataObj["RFC"];
    document.getElementById("id").textContent = id;
    const parcialidad = rowDataObj["Validación Parcialidad Solicitada"];
    document.getElementById("parcialidad").textContent = `$${parcialidad}`;
    //const fechai = rowDataObj["Fecha de inicio"];
    var partesFecha = fechai.split("/");


    var formattedfecha_inicio = new Date(fecha_inicio.replace(/-/g, '\/'));
    var fechaini = [formattedfecha_inicio.toLocaleDateString('es-ES', options)];
    document.getElementById("fecha_inicio").textContent = fechaini;
    
    const id_form = rowDataObj["id"];
    localStorage.setItem('id_form', id_form)
    
    
    //const hoy = new Date();
    


// Llamada a la función y cálculo de la diferencia

let fechaDeHoy = new Date();

let fechaSigPago = nearestDate.toLocaleDateString('es-ES', options)
document.getElementById("fechaSigPago").textContent = fechaSigPago;

let diferenciaEnMilisegundos = nearestDate - fechaDeHoy;
let diferenciaEnDias = Math.floor(diferenciaEnMilisegundos / (1000 * 60 * 60 * 24));
document.getElementById("countDays").textContent = diferenciaEnDias + " días para la fecha de pago";

    /////Línea de crédito//////
////CALCULAR REVOLVENCIA//////////////////
let paymentRevol = amountt * interes / (1 - Math.pow(1 + interes, -n));
  amortRev = [0]
  intRev = [0]
  saldo_inicialRev = [amountt];
  saldo_finalRev = [amountt];
  pagoRev = [0]
  ivaRev = [0]
 for (i = 0; i<=n; i++){
    pagoRev[i+1] = paymentRevol;
    intRev[i+1] = saldo_finalRev[i]*interes/1.16;
    ivaRev[i+1] = intRev[i+1]*0.16;
    amortRev[i+1] = paymentRevol - intRev[i+1] - ivaRev[i+1];
    saldo_inicialRev[i+1] = saldo_finalRev[i] + intRev[i+1] + ivaRev[i+1];
    saldo_finalRev[i+1] = saldo_finalRev[i] - amortRev[i+1];      
    }

let revolvencia = 0;
for (let i = 0; i < fechasPasadas+1; i++) {
  revolvencia += amortRev[i];
}
    const antgdd = rowDataObj["Antigüedad"];
    const salario = parseFloat(rowDataObj["Salario"]);
    const edad = rowDataObj["Edad exacta"];
    
    function between(value, min, max) {
    return value >= min && value <= max;
    }
    
    let porclineaMax;
    if (antgdd <= 5) {
        porclineaMax = 0.30;
    } else if (between(antgdd, 6, 11)) {
        porclineaMax = 0.70;
    } else if (between(edad, 18, 33) && antgdd >= 12) {
        porclineaMax = 1;
    } else if (between(edad, 33, 60) && antgdd >= 12) {
        porclineaMax = 1.5;
    } else if (edad > 60 && antgdd >= 12) {
        porclineaMax = 1;
    }

    const lineaMax = salario*porclineaMax;
    document.getElementById("linea_max").textContent = `$${lineaMax.toFixed(2).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",")}` ;
    //const amount= parseFloat(rowDataObj["Monto"].replace("$", ""));
    //console.log(amount)
    saldoXliberar= amount-revolvencia
    console.log(saldo_inicial[fechasPasadas+1])
    var saldo_Actual= parseFloat(saldo_inicial[fechasPasadas+1].replace(/[\$,]/g, ""))
    document.getElementById("amount_actual").textContent = `$${saldo_Actual.toFixed(2).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",")}` ;
    document.getElementById("linea_liberar").textContent = `$${saldoXliberar.toFixed(2).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",")}` ;
    const amount_disponible = lineaMax-saldoXliberar
    console.log(amount_disponible)
    document.getElementById("amount_dispo").textContent = `$${amount_disponible.toFixed(2).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",")}`
    
  function actualizarBarraDeProgreso() {
    // Calcular el porcentaje de progreso
    var progreso = (fechasPasadas/n) * 100;

    // Actualizar el valor de la barra de progreso
    var progressBar = document.getElementById("progressBar");
    progressBar.style.width = progreso + "%";
    progressBar.setAttribute("aria-valuenow", progreso);
    progressBar.textContent = progreso.toFixed() + "%";
  }
  // Llamar a la función para actualizar la barra de progreso inicialmente y cada vez que se actualicen las variables
  actualizarBarraDeProgreso(); 
  
  
   document.getElementById('fechasCounter').textContent  = fechasPasadas
  document.querySelector('#parcialidades').innerHTML = "/" + n
     const fechaVenci= fechasDePago[n]
 document.getElementById('fecha_final').textContent  = fechaVenci
 const fechasCounter = parseFloat(localStorage.getItem('fechasCounter'));
  
    const contratosigned = rowDataObj["Contrato firmado"];
    console.log("Contrato",contratosigned[0])
    signed= contratosigned[0];
    
        // Hide header and button if signed is undefined
    if (contratosigned.length === 0) {
        document.getElementById("headercontract").style.display = "none";
        document.getElementById("signedcontract").style.display = "none";
        document.getElementById("statact").style.display = "none";
    } else {
        // Set download URL for the button if URL is not null
        document.getElementById("signedcontract").addEventListener("click", function() {
            var link = document.createElement("a");
            link.href = signed;
            link.download = "contrato_firmado.pdf"; // Change filename accordingly
            document.body.appendChild(link);
            link.click();
            document.body.removeChild(link);
        });
        document.getElementById("statinact").style.display = "none";
    }
    
    const databank = rowDataObj["Carátula de Estado de Cuenta Bancario para dispersión"]
    document.getElementById('infobank').addEventListener("click", function() {
            var linkb = document.createElement("a");
            linkb.href = databank;
            linkb.download = "infobank.pdf"; // Change filename accordingly
            document.body.appendChild(linkb);
            linkb.click();
            document.body.removeChild(linkb);
        });
        
    const idEnv = rowDataObj["id"];
    localStorage.setItem( 'idEnv', idEnv);
    localStorage.setItem( 'com', c);
    localStorage.setItem( 'tic', interestic);
    localStorage.setItem( 'salario', amount_disponible);
    localStorage.setItem( 'rfc', id);
     
    
  
    
});