// {} Librerías e importaciones

// ! Tabla
import Tabla from '../../../elementos/tabla.js';

// ! Parámetros
import { parametros, formatoNumerico } from '../../../../utilidades.js';

// {}
(async () => {

  // ! Declaración de variables
  let
    peticion = { actual: null },
    tabla = {
      asistencias: {
        elemento: $(tablaRegistrosAsistencias),
        clase: new Tabla({
          tabla: tablaRegistrosAsistencias,
          datos: {
            peticion: {
              ruta: `${window.aplicacion.enlace}/ejecutar`,
              parametro: {
                procedimiento: 'p_traer_empleados_proyecto',
                renglon: '',
                id_nomina: () => id_nomina.value,
                id_proyecto: () => id_proyecto.value,
                fecha: () => fecha.value
              }
            }
          },
          configuracion: { dom: `t`, pageLength: -1 }
        })
      },
      empleados: {
        elemento: $(tablaRegistrosEmpleados),
        clase: new Tabla({
          tabla: tablaRegistrosEmpleados,
          datos: {
            peticion: {
              ruta: `${window.aplicacion.enlace}/ejecutar`,
              parametro: {
                procedimiento: 'p_traer_empleados_proyecto',
                renglon: 'AGREGAR_EMPLEADO',
                id_nomina: () => id_nomina.value,
                id_proyecto: () => id_proyecto.value,
                fecha: () => fecha.value
              }
            }
          },
          configuracion: { dom: `ft`, pageLength: -1 }
        })
      }
    },
    ventana = {
      empleados: {
        instancia: new bootstrap.Modal(ventanaEmergenteEmpleados)
      }
    }

	// !
	await tabla.asistencias.clase.inicializar();
	tabla.asistencias.instancia = tabla.asistencias.elemento.DataTable();

	// !
	await tabla.empleados.clase.inicializar();
	tabla.empleados.instancia = tabla.empleados.elemento.DataTable();

  // !
  ventana.empleados.elemento = ventana.empleados.instancia._element;
  ventana.empleados.encabezado = ventana.empleados.elemento.querySelector('.modal-header');
  ventana.empleados.cuerpo = ventana.empleados.elemento.querySelector('.modal-body');

  ventana.empleados.pie = { elemento: ventana.empleados.elemento.querySelector('.modal-footer') };
  ventana.empleados.pie.boton = {
    seleccionar: ventana.empleados.pie.elemento.querySelector('.btn-success')
  }

  // !
  $(id_proyecto).change(function(evento) {

    // +
    if (!this.value)
      return formularioAsistencias.reset()
    ;

    // +
    peticion.actual && peticion.actual.abort();

    // +
    peticion.actual = $.ajax({
      url: `${window.aplicacion.enlace}/ejecutar`,
      data: {
        procedimiento: 'p_traer_periodos_nomina',
        renglon: 'PERIODO',
        id_proyecto: this.value,
        id_estado: 1
      },
      beforeSend: (peticion, configuracion) => {

        formularioAsistencias.dataset.campoPrevenir = '#id_proyecto';
        formularioAsistencias.reset();
        delete formularioAsistencias.dataset.campoPrevenir

      },
      success: function(respuesta, estado, peticion) {

        // ?
        if (!respuesta.length)
          return
        ;

        respuesta = respuesta[0];

        id_nomina.value = respuesta.id_nomina;
        nomina.value = respuesta.nomina;
        fecha.min = respuesta.fecha_inicial.split('/').reverse().join('-');
        fecha.max = respuesta.fecha_final.split('/').reverse().join('-');
        fecha.value = fecha.min;

        fecha.disabled = false;

        $(fecha).trigger('change')

      },
      error: function(peticion, estado) {},
      complete: function(peticion, estado) {}
    })

  });

  // !
  $(fecha).change(function(evento) {

    this.blur();

    if (!this.value)
      return
    ;

    tabla.asistencias.instancia.ajax.reload();
    tabla.empleados.instancia.ajax.reload()

  });

  // !
  $(botonGuardar).click(function(evento) {

		// +
		let formulario = {
			peticion: { parametros: parametros(formularioAsistencias) }
		}

    formulario.peticion.parametros.append(
      'json_detalle_asistencia',
      JSON.stringify(
				tabla.asistencias.instancia.data().toArray().map(valor => ({
          id_empleado: Number(valor.id_empleado),
          asistencia: Number(valor.asistencia),
          medio_dia: Number(valor.medio_dia),
          otros: Number(valor.otros)
        }))
			)
    );

    window.aplicacion.peticion.formulario.parametro = formulario.peticion.parametros

  });

  // !
  // $('#tablaRegistrosAsistencias thead').on('click', '[type="checkbox"]', function(evento) {

  //   let tabla = {
  //     fila: {
  //       columna: {
  //         caja: $(this).closest('table').is('.dataTable')
  //           ? $(this)
  //             .closest('.dataTables_scroll')
  //             .find(`
  //               .dataTables_scrollBody
  //               tbody
  //               td:nth-child(${$(this).parent().index() + 1})
  //               [type="checkbox"]:enabled
  //             `)
  //           : $(this)
  //             .closest('table')
  //             .find(`
  //               tbody
  //               td:nth-child(${$(this).parent().index() + 1})
  //               [type="checkbox"]:enabled
  //             `)
  //       }
  //     }
  //   }

  //   tabla.fila.columna.caja.each((iteracion, valor) => {

  //     if (
  //       !$(valor)
  //         .closest('tr')
  //         .find('[type="checkbox"]:enabled')
  //         .not(tabla.fila.columna.caja)
  //         .prop('checked')
  //     )
  //       $(valor)
  //         .prop('checked', !evento.target.checked)
  //         .val(!Number(evento.target.checked))
  //         .click()

  //   })

  // });

  // !
  tabla.asistencias.elemento.find('tbody').on('change', 'tr', function(evento) {

    if (evento.tabla.celda.nombre !== 'otros') {

      evento.tabla.celda.afectar.nombre = evento.tabla.celda.nombre === 'asistencia'
        ? 'medio_dia'
        : 'asistencia'
      ;
      evento.tabla.celda.afectar.instancia = tabla.asistencias.instancia
        .cell(this._DT_RowIndex, `[data-columna-nombre=${evento.tabla.celda.afectar.nombre}]`)
      ;

      evento.tabla.celda.instancia.data(evento.tabla.celda.valor.asignar.toString());
      evento.tabla.celda.afectar.instancia.data('0');

      return

    }

    evento.tabla.instancia.cell(this._DT_RowIndex, '[data-columna-nombre=total]').data(
      (Number(evento.tabla.fila.datos.sueldo) + Number(evento.tabla.fila.datos.otros)).toString()
    );

    evento.tabla.columna.total.pie.elemento.textContent = formatoNumerico(
      evento.tabla.columna.sueldo.pie.total() + evento.tabla.columna.otros.pie.total(),
    2)

  });

  // !
  tabla.empleados.elemento.on('draw.dt', function(evento) {

    botonAgregar.disabled = !!this.querySelector('tbody td.dataTables_empty')

  });

  $(ventana.empleados.pie.boton.seleccionar).click(function(evento) {

    evento.tabla = {
      filas: { seleccionadas: tabla.empleados.instancia.rows(':has(input:checked)') }
    }

    if (!evento.tabla.filas.seleccionadas.count())
      return
    ;

    tabla.asistencias.instancia.rows.add(evento.tabla.filas.seleccionadas.data()).draw(false);

    evento.tabla.filas.seleccionadas.remove().draw(false);

    ventana.empleados.instancia.hide()

  })

})()
