// Función para capitalizar texto
function capitalizingString(string) {
  return string.replace(/\w\S*/g, (match) => {
    return match.charAt(0).toUpperCase() + match.substr(1).toLowerCase();
  });
}
// Funcion fecha hallar la semana
function fechaASemana(date_) {

  date = new Date(date_)
  fechaD = new Date(date_);
  fechaH = new Date(date_);

  fechaD.setDate(fechaD.getDate() + 1);
  fechaH.setDate(fechaH.getDate() + 1);
  date.setDate(date.getDate() + 1);

  while (fechaD.getDay() != 1) {
    fechaD.setDate(fechaD.getDate() - 1);
  }

  while (fechaH.getDay() != 0) {
    fechaH.setDate(fechaH.getDate() + 1);
  }


  desde = fechaD
  hasta = fechaH


  diaDesde = (fechaD.getDate() < 10) ? '0' + fechaD.getDate() : fechaD.getDate()
  mesDesde = ((fechaD.getMonth() + 1) < 10) ? '0' + (fechaD.getMonth() + 1) : fechaD.getMonth() + 1
  añoDesde = fechaD.getFullYear()

  diaHasta = (fechaH.getDate() < 10) ? '0' + fechaH.getDate() : fechaH.getDate()
  mesHasta = ((fechaH.getMonth() + 1) < 10) ? '0' + (fechaH.getMonth() + 1) : fechaH.getMonth() + 1
  añoHasta = fechaH.getFullYear()

  desdeC = `${añoDesde}-${mesDesde}-${diaDesde}`
  hastaC = `${añoHasta}-${mesHasta}-${diaHasta}`

  return `${desdeC}/${hastaC}`

}

function getCurrentWeek() {
  const now = new Date();
  const yearStart = new Date(now.getFullYear(), 0, 1); // 1 de enero del año actual
  const daysSinceYearStart = Math.floor((now - yearStart) / (24 * 60 * 60 * 1000)) + 1; // Días desde el inicio del año
  const weekNumber = Math.ceil(daysSinceYearStart / 7); // Calcula la semana actual
  const year = now.getFullYear();

  // Formato 'YYYY-WW' (se asegura de que la semana tenga dos dígitos con padStart)
  const weekISO = `${year}-W${String(weekNumber).padStart(2, '0')}`;
  return weekISO;
}

function getISOWeek(dateString) {
  const date = new Date(dateString);
  const startDate = new Date(date.getFullYear(), 0, 1); // Primer día del año
  const days = Math.floor((date - startDate) / (24 * 60 * 60 * 1000)); // Días transcurridos desde el inicio del año
  return `${date.getFullYear()}-W${Math.ceil((days + startDate.getDay() + 1) / 7)}`; // Obtener la semana
}
// Funcion dosDigitos
function DosDigitos(numero) {
  if (numero < 10) {
    numero = '0' + numero
  }
  return numero
}

// Funcion Fecha Actual
function fechaActual(e = '') {
  mesesL = ['Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre'];
  mesesS = ['Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun', 'Jul', 'Ago', 'Sep', 'Oct', 'Nov', 'Dic'];

  var fechaActual_ = e == '' ? new Date() : new Date(e);
  monthIndex = fechaActual_.getMonth();

  year = fechaActual_.getFullYear();
  day = fechaActual_.getDate();

  if (day < 10) {
    day_txt = '0' + day;
  } else {
    day_txt = day.toString()
  }



  return arr = {
    dia_num: day,
    dia_txt: day_txt,
    mes_num: monthIndex + 1,
    mes_num_txt: monthIndex + 1 < 10 ? `0${monthIndex + 1}` : `${monthIndex + 1}`,
    mes_txt: mesesL[monthIndex],
    mes_short: mesesS[monthIndex],
    año: year,
    full: `${year}-${ monthIndex + 1 < 10 ? `0${monthIndex + 1}` : monthIndex + 1}-${day_txt}`
  }
}

// Funcion para pasar de 2024-04-02 a 02-abr-2024 
function convertirFecha(fechaString) {
  // Crear un objeto Date a partir de la cadena de fecha
  var fecha = new Date(fechaString);

  // Obtener el nombre del mes abreviado
  var meses = ['ene', 'feb', 'mar', 'abr', 'may', 'jun', 'jul', 'ago', 'sep', 'oct', 'nov', 'dic'];
  var mesAbreviado = meses[fecha.getMonth()];

  // Obtener el día y añadir un cero inicial si es necesario
  var dia = fecha.getDate() + 1;

  if (dia < 10) {
    dia = '0' + dia;
  }

  // Obtener el año
  var año = fecha.getFullYear();

  // Construir la fecha en el formato deseado
  var fechaFormateada = dia + '-' + mesAbreviado + '-' + año;

  return fechaFormateada;
}

function loader(action) {
  if (action == 'show') {
    document.querySelector('.loader').classList.remove('hide')
  } else if (action == 'hide') {
    document.querySelector('.loader').classList.add('hide')
  }

}

// Validar formulario
function validarForm(idForm, claseVal) {
  valido = true
  inputs = document.querySelectorAll(`#${idForm} .input_`)

  inputs.forEach(input => {
    if (input.value.trim() == '' && input.classList.value.includes(claseVal) ||
      (input.value.includes('$') && input.value.length <= 4 && input.classList.value.includes(claseVal))) {
      Swal.fire({
        title: "Error de registro",
        text: `Se detectaron campos vacios`,
        icon: "error"
      });

      input.classList.add('is-invalid')
      input.classList.remove('is-valid')
      valido = false
    } else {
      input.classList.remove('is-invalid')
      input.classList.add('is-valid')
    }

    input.addEventListener('input', () => {
      if (input.value.trim() == '' && input.classList.value.includes(claseVal) ||
        (input.value.includes('$') && input.value.length <= 4 && input.classList.value.includes(claseVal))) {
        input.classList.add('is-invalid')
        input.classList.remove('is-valid')
      } else {
        input.classList.remove('is-invalid')
        input.classList.add('is-valid')
      }
    })

  });

  return valido;
}

// Funcion para agregar formato  $ 100.000,12
function AddFormatMoneda(numero) {


  numero = numero.toString()

  if (numero.includes('-')) {
    n = '-'
  } else {
    n = ''
  }

  try {

    numero = numero.replace(/[^0-9]/g, '')
    decim = numero.split('.')[1] ? `,${numero.split('.')[1]}` : ''
    numero = numero.split('.')[0]
    rs = '$ ' + numero.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ".")
  } catch (error) {
    rs = numero
  }
  return `${n}${rs}${decim}`;
}

// Funcion para remover formato a $ 100.000,12
function RemoveFormatMoneda(numero) {

  if (numero == '' || numero == 0) {
    return 0
  }

  if (numero.includes('-')) {
    neg = -1
  } else {
    neg = 1
  }

  if (numero.includes('$ ')) {
    decim = numero.split(',')[1] ? `.${numero.split(',')[1]}` : ''
    numero = numero.split(',')[0]
    n = parseFloat(`${numero.replace(/[^0-9]/g, '')}${decim}`);

  } else {
    n = numero
  }

  if (!isNaN(n * neg)) {
    n = n * neg
  }

  return n
}

// Funcion para traer los datos de la BD
async function ObtenerDatos(BD, url) {

  // Se envian los datos en .json ----------
  const datosRg = new FormData();
  datosRg.append("BD", BD);

  var peticion = await fetch(
    url, {
      method: "POST",
      body: datosRg,
    }
  );

  var respuesta = await peticion.json();

  return respuesta
}

// Funcion para crear la tabla 
function CrearDataTable(idTabla, arrayObjetos, columnDefs = []) {

  return new Promise((resolve) => {
    $(function () {
      const columnas = [];


      if (arrayObjetos.data.length == 0) {

        for (let index = 0; index < arrayObjetos.etiquetas.length; index++) {
          columnas.push({
            "data": arrayObjetos.etiquetas[index],
            "title": arrayObjetos.etiquetas[index].toUpperCase().replace(/_/g, ' ')
          });
        }


      } else {

        Object.keys(arrayObjetos.data[0]).forEach(e => {
          columnas.push({
            "data": e,
            "title": e.toUpperCase().replace(/_/g, ' ')
          });

        });

      }

      $(`#${idTabla}`).DataTable({
        "destroy": true,
        "paging": true,
        "lengthChange": true,
        "searching": true,

        "responsive": true,
        "language": {
          "url": "//cdn.datatables.net/plug-ins/1.10.24/i18n/Spanish.json"
        },
        "columns": columnas,
        "data": arrayObjetos.data,
        "columnDefs": columnDefs

      });

      ;
    });
  });
}

// Funcion para crear los campos de registro
function FormRegistro(div_form, output_type, validClass) {

  div_ = document.getElementById(div_form)
  arrrayKeys = Object.keys(output_type)
  arrayValues = Object.values(output_type)
  text_ = ''


  // Creamos el contenido (input/select) form de la ventana modal
  arrayValues.forEach((value, index) => {

    n = arrrayKeys[index]

    vacio = Object.keys(arrayValues[index]).includes('vacio') && !!arrayValues[index].vacio
    ReadOnly = Object.keys(arrayValues[index]).includes('readOnly') && !!arrayValues[index].readOnly
    vacio = !!vacio ? '' : validClass
    ReadOnly = !!ReadOnly ? 'readOnly = "true"' : ''

    if (value.type == 'input') {

      text_ +=
        `
            <div class="form-group col-12 col-sm-6">
                <label class="d-flex justify-content-between mb-0 text-secondary b" for="">${capitalizingString(n).replace(/_/g, ' ')} </label>
                <input type="text" class="form-control form-control-sm ${vacio} input_" id="${n}" name="${n}" placeholder="${capitalizingString(n).replace(/_/g, ' ')}" autocomplete="off" ${ReadOnly}>
            </div>

            `

    } else if (value.type == 'select') {

      opt = ''
      value.options.forEach(mi_opt => {
        opt += `<option>${mi_opt}</option>`
      });

      text_ +=
        `
            <div class="form-group col-12 col-sm-6">
                <label class="d-flex justify-content-between mb-0 text-secondary b" for="gr_estado">${capitalizingString(n).replace(/_/g, ' ')}</label>
                <select class="form-control form-control-sm ${vacio} input_" id="${n}" name="${n}" ${ReadOnly}>
                    <option value="" disabled selected>Selecciona una opción</option>  
                    ${opt}                            
                </select>                           
            </div>   

            `
    } else if (value.type == 'datalist') {
      opt = ''
      value.options.forEach(mi_opt => {
        opt += `<option>${mi_opt}</option>`
      });

      text_ +=
        `
            <div class="form-group col-12 col-sm-6">
                <label class="d-flex justify-content-between mb-0 text-secondary b" for="gr_estado">${capitalizingString(n).replace(/_/g, ' ')}</label>
                <input  class="form-control form-control-sm ${vacio} input_"  ${ReadOnly} name="${n}" id="${n}" list="datalistOptions_${n}"  placeholder="${capitalizingString(n).replace(/_/g, ' ')}">

                <datalist id="datalistOptions_${n}">
                    ${opt}  
                </datalist>
                                 
            </div>   

            `
    } else if (value.type == 'date') {

      const f = new Date

      default_ = !!arrayValues[index].default ? `value="${f.getFullYear()}-${DosDigitos(f.getMonth()+1)}-${DosDigitos(f.getDate())}"` : ''


      text_ +=
        `
            <div class="form-group col-12 col-sm-6">
                <label class="d-flex justify-content-between mb-0 text-secondary b" for="">${capitalizingString(n).replace(/_/g, ' ')} </label>
                <input type="date" class="form-control form-control-sm ${vacio} input_" id="${n}" ${default_} name="${n}" placeholder="${capitalizingString(n).replace(/_/g, ' ')}" autocomplete="off" ${ReadOnly}>
            </div>

            `

    } else if (value.type == 'textarea') {

      text_ +=
        `
            <div class="form-group col-12 col-sm-12">
                <label class="d-flex justify-content-between mb-0 text-secondary b" for="">${capitalizingString(n).replace(/_/g, ' ')} </label>                
                <textarea class="form-control ${vacio} input_"  id="${n}" name="${n}"  placeholder="${capitalizingString(n).replace(/_/g, ' ')}" autocomplete="off" rows="2" ${ReadOnly}></textarea>
            </div>`

    }
  })

  // Agregamos los input / select creados 
  div_.innerHTML = ` <form id="form_${div_form}" enctype="multipart/form-data" ><div class="form-row" style="margin:5px" id="">${text_} </div></form>`

}

// Funcion para registrar los datos
const Registrar = async (bd, datosRg, ruta) => {

  try {
    // Cambia los botones
    loader('show')
    document.getElementById('registrar').disabled = true
    document.querySelector('[data-dismiss="modal"]').disabled = true
    document.querySelector('.btn.btn-default').disabled = true
  } catch (error) {

  }


  datosRg.append('BD', bd)

  // Envía los datos en formato JSON a través de una solicitud fetch
  const registrarClientes = await fetch(ruta, {
    method: 'POST',
    body: datosRg,

  });

  // Verifica si la solicitud fue exitosa
  if (!registrarClientes.ok) {
    setTimeout(() => {
      // Cambia los botones
      loader('hide')
      document.getElementById('registrar').disabled = false
      document.querySelector('[data-dismiss="modal"]').disabled = false
      document.querySelector('.btn.btn-default').disabled = false
      throw new Error('Error en la solicitud');
    }, 600)

  }

  // Espera la respuesta del servidor en formato JSON
  const resultado = await registrarClientes.json();

  if (resultado) {
    // Cambia los botones
    try {
      loader('hide')
      document.getElementById('registrar').disabled = false
      document.querySelector('[data-dismiss="modal"]').disabled = false
      document.querySelector('.btn.btn-default').disabled = false
      document.querySelector('[data-dismiss="modal"]').click()
    } catch (error) {

    }

    setTimeout(() => {
      Swal.fire({
        title: "Registro exitoso",
        text: "El registro se agregó correctamente",
        icon: "success",
      })


    }, 100);



    return resultado
  }







};


document.addEventListener('DOMContentLoaded', async (e) => {
  // ACTIVAR COLOR SELECCIONADO ACTUAL
  try {
    document.querySelector(`[data-module="${document.getElementById('module_active').getAttribute('dt')}"]`).classList.add('active')
  } catch (error) {
    console.log('No se cambio el color')
  }
})

// document.getElementById('valor').addEventListener('change',()=>{
//     document.getElementById('valor').value = AddFormatMoneda(document.getElementById('valor').value)
// })
