// {} Librerías e importaciones

// ! Utilidades
import { formatoNumerico, parametros } from "../../../../utilidades.js";

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

// {}
(async () => {

  // ! Declaración de variables
  let
    peticion = { actual: null },
    campo = { monto: window.aplicacion.campo.mascara.monto },
    tabla = {
      facturas: {
        elemento: $(tablaRegistros),
        clase: new Tabla({
          datos: {
            peticion: {
              ruta: `${window.aplicacion.enlace}/ejecutar`,
              parametro: {
                procedimiento: 'p_traer_facturas_para_pagos',
                renglon: 'CXP',
                id_entidad: () => !id_entidad.value ? -1 : id_entidad.value,
                id_proyecto: () => id_proyecto.value,
                metodo_aplicacion: () => metodo_aplicacion.value,
                monto: () => campo.monto.unmaskedValue
              }
            }
          },
          configuracion: { dom: `ft` }
        })
      }
    }

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

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

    documento.value = null;

    if (!this.value)
      return
    ;

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

    // +
    peticion.actual = $.ajax({
      url: `${window.aplicacion.enlace}/ejecutar`,
      data: {
        procedimiento: 'p_traer_secuencias',
        renglon: 'BANCOS',
        id_tipo_documento: this.value,
        accion: 'NUEVO'
      },
      beforeSend: function(peticion, configuracion) {},
      success: function(respuesta, estado, peticion) {

        if (!respuesta.length)
          return
        ;

        respuesta = respuesta[0];

        documento.value = respuesta.secuencia

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

  });

  // !
  $(id_suplidor).focusout(function(evento) {

    // +
    if (!this.value)
      return $([id_entidad, id_suplidor, tablaRegistros]).trigger('reset')
    ;

    // + Condición para verificar si la
    // + petición existe y cancelarla
    peticion.actual &&
    peticion.actual.abort();

    // + Petición hacía el
    // + controlador 'traerRegistros'
    peticion.actual = $.ajax({
      url: `${window.aplicacion.enlace}/ejecutar`,
      data: {
        procedimiento: 'p_traer_unico_registro',
        renglon: 'SUPLIDOR',
        id_renglon: this.value
      },
      beforeSend: (peticion, configuracion) => $([id_entidad, id_suplidor]).trigger('reset'),
      success: function(respuesta, estado, peticion) {

        if (!respuesta.length)
          return
        ;

        respuesta = respuesta[0];

        id_entidad.value = respuesta.id_entidad;
        window.aplicacion.campo.mascara.id_suplidor.value = respuesta.id_suplidor;
        suplidor.value = respuesta.suplidor

      },
      error: function(peticion, estado) {},
      complete: (peticion, estado) => tabla.facturas.instancia.ajax.reload()
    })

  });

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

    if (this.value === 'VENCIMIENTO')
      tabla.facturas.instancia.clear().draw(false)
    else
      monto.dispatchEvent(new Event('change'))

  });

  // !
  $(monto).change(function(evento) { tabla.facturas.instancia.ajax.reload() });

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

    if (metodo_aplicacion.value === 'LIBRE')
      campo.monto.typedValue = evento.tabla.columna.aplicado.pie.total()
    ;

    evento.tabla.instancia.cell(this._DT_RowIndex, '[data-columna-nombre=pendiente]').data(
      evento.tabla.fila.datos.balance - evento.tabla.fila.datos.aplicado
    );

    evento.tabla.columna.pendiente.pie.elemento.textContent = formatoNumerico(
      Math.abs(evento.tabla.columna.balance.pie.total() - evento.tabla.columna.aplicado.pie.total()),
    2)

  });

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

    $(this).find('tbody input').prop('disabled', metodo_aplicacion.value === 'VENCIMIENTO');

    if (metodo_aplicacion.value === 'VENCIMIENTO')
      campo.monto.value = tabla.facturas.instancia.column('[data-columna-nombre=aplicado]').footer().textContent

  });

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

    let formulario = {
      peticion: { parametros: parametros(formularioDocumentosCXP) }
    }

    formulario.peticion.parametros.append(
      'json_detalle_facturas',
      JSON.stringify(tabla.facturas.instancia.rows(':has(input:checked)').data().toArray().map(valor => ({
        id_factura: Number(valor.id_factura),
        monto: Number(valor.aplicado)
      })))
    );

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

  });

  // !
  $(document).on('ajaxSuccess', function(evento, configuracion) {

    if (
      window.aplicacion.peticion.formulario.elemento === formularioDocumentosCXP &&
      window.aplicacion.peticion.formulario.exitosa.propiedades === window.aplicacion.peticion.exitosa.propiedades
    )
      imprimir(window.aplicacion.peticion.formulario.exitosa.propiedades.responseJSON[0].id_registro)

  });

	function imprimir(id) {

		console.log(id)

		const impresion = {
			programa: 'procesos.documentosCxp',
			renglon: 'DOCUMENTO_CXP',
			id: Number(id)
		}

		$.ajax({
			type: 'get',
			url: `${window.aplicacion.enlace}/impresion`,
			data: impresion,
			dataType: 'JSON',
			success: async function (response) {

				const nuevaVentana = window.open(''
				,'_blank',
				`width = 992, height = 600, left = ${(window.screen.width - 992) / 2}, top = ${(window.screen.height - 600) / 2}`,
				);
				nuevaVentana.document.write(response);
				nuevaVentana.document.close();

			}
		});
	}

})()
