document.addEventListener("DOMContentLoaded", function() {
  const interestic = parseFloat(localStorage.getItem('tasa'));
  console.log(interestic)
  const com = parseFloat(localStorage.getItem('c'));
  console.log(com)
  const amount = parseFloat(localStorage.getItem('monto').replace(/[\$,]/g, ""));
  console.log(amount)
  const periodo = parseFloat(localStorage.getItem('periodo'));
  console.log("Periodo:",periodo)
  const plazo = parseFloat(localStorage.getItem('plazo'));
  console.log("Plazo:",plazo)
  const fechai = localStorage.getItem('fechai');
    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);

  let n = Math.floor(plazo / periodo); // Redondear hacia abajo
  console.log(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
  console.log("desembolso:", d)
  let cost = (((d/amountt-1)*100)*12)/((plazo/30)*1.16)
  
 // Vectores que utilizaremos en el loop que genera la tabla
    var options = { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' };
    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(cantidadPagos, periodo) {
    const fechas = [];
    const options = { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' }; // Options for formatting the date

    let fechaActual = new Date(fecha_inicio.replace(/-/g, '\/'));

    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(n+1, periodo);
console.log(fechasDePago);




  // 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();
    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, ",")
  
  
  window.CAT = (function(){
  function getCATValue(total, charge, pay, payments, periods, cat){
    var i = 0;
    var value = charge / Math.pow((1+(cat/100)), 0/periods);
    
    for(i = 1; i <= payments; i++){
      value += pay / Math.pow((1+(cat/100)), i/periods);
    }
    return total - value;
  }
  var CAT = {
    get: function(amount, charge, byPeriod, totalPayments, periodsByYear){
      var cat = 50, cat_min = 0, cat_max = 0, temp_cat;

      var counter = 0, tempVal;
      
      do{
        tempVal = getCATValue(amount, charge, byPeriod, totalPayments, periodsByYear, cat);
        if(tempVal > 0){
          temp_cat = cat;
          cat = (cat+cat_min)/2;
          cat_max = temp_cat;
        }else if(cat_max == 0){
          cat_min = cat;
          cat = cat + 50;
        }else{
          temp_cat = cat;
          cat = (cat+cat_max)/2;
          cat_min=temp_cat;
        }
        counter++;
      }while(counter <= 25);
      
      return (cat/1.16).toFixed(2)
    }
  };
  return CAT;
}());


// Example usage:
var byperiod = 360/periodo
var cat = CAT.get(amountt*(1+comision), comision, payment, n, byperiod);
console.log("CAT:", cat)
localStorage.setItem( 'cat', cat);

  //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;

pagos_total =  d.toLocaleString(undefined, {maximumFractionDigits: 2});
//desembolso = d.toLocaleString(undefined, {maximumFractionDigits: 2});
tasa = (interestic/1.16).toLocaleString(undefined, {maximumFractionDigits: 2});
parcialidades = n.toLocaleString(undefined, {maximumFractionDigits: 2});
linea = amountt.toLocaleString(undefined, {maximumFractionDigits: 2});
comisionaper = com/1.16.toLocaleString(undefined, {maximumFractionDigits: 2});

localStorage.setItem( 'tasa', tasa);
localStorage.setItem( 'pagos_total', pagos_total);

console.log("PagosSuma:", pagos_total)
document.getElementById("periodicidad").textContent = periodicidad;
  document.querySelector('#cat').innerHTML = `${cat}%`
  document.querySelector('#desembolso').innerHTML = `$${pagos_total}`
  document.querySelector('#linea').innerHTML = `$${linea}`
  
  document.querySelector('#interes').innerHTML = `${tasa}%`
  document.querySelector('#meses').innerHTML = `${plazo/30}`
  document.getElementById("fechadisp").textContent = hoy.toLocaleDateString('es-ES', options);
  document.getElementById("comisionaper").textContent = comisionaper
  
  
  /*
  let capital_c = [capital_ic];
  let capital_g = [capital_cv];
  let capital_t = [amount];
  let fechas = [0]
  for (i = 0; i<months; i++){
  fechas[i+1] = fechas[i] + 1 ;
      }
  console.log(fechas)    
  for (i = 0; i<=months; i++){
  capital_c[i+1] = capital_c[i]*(1+interestic);
  capital_g[i+1] = capital_g[i] //+ capital_cv*interestcv
  capital_t[i+1] = capital_c[i] + capital_g[i]
      }
  
  console.log(capital_t)

  
  x = pagos_totales - amount
  rentabilidad = (100*((payment_cv*months + capital_cv + capital_ic*(1+interestic)**(months))/amountt-1)).toFixed(2)
  */
  //regedit to add a comma after every three digits
  //payment = payment.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); //\B looks for a word boundary, ? says what to look for, \d looks for 3 digits in a row
  //payment = payment.toLocaleString(undefined, {maximumFractionDigits: 2});
  //
  //
  //numdigit = d.toLocaleString(undefined, {maximumFractionDigits: 2});
  //
  //costo = cost.toLocaleString(undefined, {maximumFractionDigits: 2});
  //p = periodo.toLocaleString(undefined, {maximumFractionDigits: 0});
  //term = plazo.toLocaleString(undefined, {maximumFractionDigits: 0});
  //cat = cat.toLocaleString(undefined, {maximumFractionDigits: 2});
  //van = npv.toLocaleString(undefined, {maximumFractionDigits:2});
  //rentabilidad = rent.toLocaleString(undefined, {maximumFractionDigits:4});
  
   });



