// {} Librerías e importaciones

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

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

// {}
(async () => {

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

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

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

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

    // +
    if (!this.value) {
      return $([id_cliente, cliente, id_entidad]).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: 'CLIENTE',
				filtro: 'CLIENTE_NOMBRE',
        id_renglon: this.value
      },
      beforeSend: function(peticion, configuracion) { $([id_cliente, cliente, id_entidad,tablaRegistros]).trigger('reset'); },
      success: function(respuesta, estado, peticion) {

        if (!respuesta.length)
					return
				;

      },
      error: function(peticion, estado) {},
      complete: function(peticion, estado) { $('#tablaRegistros').DataTable().ajax.reload() },
      campo: { elemento: this },
			formulario: { elemento: formularioCobrosFacturas }
      })

  });

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

		id_cuenta_banco.disabled = this.value !== 'TRANSFERENCIA';

		this.value !== 'TRANSFERENCIA' ? $(id_cuenta_banco).val('').change() : '';

		botonDetalleCheque.classList[this.value === 'CHEQUE' ? 'remove' : 'add']('d-none');

		if (this.value === 'CHEQUE')
			tabla.cheques.instancia.clear().draw()

	});

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

		// +
		$('#tablaRegistros').DataTable().ajax.reload()

		fecha.disabled = true

		metodo_aplicacion.disabled = true;

	});

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

		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')

  });

	// !
	$('#tablaRegistrosDetalleCheques tbody').on('dblclick', 'tr', function(evento) {

    // +
    let datos = $('#tablaRegistrosDetalleCheques').DataTable().row(this).data();

    // +
    $(numero_cheque).val(datos.numero_cheque)
    $(id_banco).val(datos.id_banco).change();
    campo.montoDetalle.value = datos.monto.toString().replaceAll(',','');
    $(beneficiario).val(datos.beneficiario)

  });

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

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

		formulario.peticion.parametro.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)
			})))
		);

		formulario.peticion.parametro.append(
			'json_detalle_cheques',
			JSON.stringify(tabla.cheques.instancia.data().toArray())
		);

		// +
		window.aplicacion.peticion.formulario.parametro = formulario.peticion.parametro

	});

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

		// +
		let datos_cheque = {
			numero_cheque: numero_cheque.value,
			id_banco: Number($(id_banco).val()),
			banco: $('#id_banco option:selected').text().trim(),
			monto: Number(montoDetalle.value.replaceAll(',','')),
			beneficiario: beneficiario.value
		},
		ventana = {
			emergente: { mensaje: '' }
		},
		formulario = {
			campos : { validar: $(`[name="numero_cheque"], [name="id_banco"], [name="monto"], [name="beneficiario"]`).removeClass('is-invalid') }
		}

		// +
		if (
			(!document.activeElement.type && !['BODY', 'DIV'].includes(document.activeElement.tagName)) ||
			(document.activeElement.type && document.activeElement.type !== 'submit')
		)
			return
		;

		// +
		$(this).find('.is-invalid').removeClass('is-invalid');

		// +
		$('#ventanaEmergenteAlerta .modal-header')
			.removeClass('bg-success')
			.addClass('bg-danger')
		;

		// +
		if(!datos_cheque.numero_cheque)
		{
			ventana.emergente.mensaje = 'NO PUEDES DEJAR EL NUMERO DE CHEQUE VACÍO.'

			window.aplicacion.peticion.formulario.campo.invalido = $('#numero_cheque')
		}
		else if(!datos_cheque.id_banco)
		{
			ventana.emergente.mensaje = 'NO PUEDES DEJAR EL BANCO VACÍO.'

			window.aplicacion.peticion.formulario.campo.invalido = $('#id_banco')

		}
		else if(!datos_cheque.beneficiario)
		{
			ventana.emergente.mensaje = 'NO PUEDES DEJAR EL BENEFICIARIO VACÍO.'

			window.aplicacion.peticion.formulario.campo.invalido = $('#beneficiario')
		}
		else if(!datos_cheque.monto || datos_cheque.monto < 0 )
		{
			ventana.emergente.mensaje = 'NO PUEDES DEJAR EL MONTO EN BLANCO.'

			window.aplicacion.peticion.formulario.campo.invalido = $('#montoDetalle')

		}

		// +
		if (formulario.campos.validar.is(window.aplicacion.peticion.formulario.campo.invalido)) {

			window.aplicacion.peticion.formulario.campo.invalido.addClass('is-invalid');

			window.aplicacion.peticion.formulario.campo.invalido =
				window.aplicacion.peticion.formulario.campo.invalido.first()
			;

			$(ventanaEmergenteAlerta).find('.modal-body p').text(ventana.emergente.mensaje);

			return $(ventanaEmergenteAlerta).modal('show')

		}

		// +
		fila = $(`#tablaRegistrosDetalleCheques tbody .numero_cheque:contains(${numero_cheque.value})`);

		if(fila.length > 0 && fila[0].textContent === numero_cheque.value) {

			$('#tablaRegistrosDetalleCheques').DataTable().row(fila).data(datos_cheque).draw(false);

			formularioDetalleCheques.reset();

			return false
		}

		$(tablaRegistrosDetalleCheques).DataTable().row.add(datos_cheque).draw(false);

		formularioDetalleCheques.reset();

		campo.monto.value = $('#tablaRegistrosDetalleCheques_wrapper .dataTables_scroll .dataTables_scrollFootInner .monto').text()

	});

	// !
	$(tablaRegistrosDetalleCheques).on('draw.dt', function () {

		campo.monto.value = $('#tablaRegistrosDetalleCheques_wrapper .dataTables_scroll .dataTables_scrollFootInner .monto').text();

	});

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

    if (
        window.aplicacion.peticion.formulario.elemento === formularioCobrosFacturas &&
        window.aplicacion.peticion.formulario.exitosa.propiedades === window.aplicacion.peticion.exitosa.propiedades &&
				new URLSearchParams(window.aplicacion.peticion.exitosa.configuracion.url).get('renglon') === 'guardar'
      ) {

        $(tablaRegistrosDetalleCheques)
					.DataTable()
					.clear()
					.draw()
				;

				const id = Number(window.aplicacion.peticion.formulario.exitosa.propiedades.responseJSON[0].id_registro)

				imprimir(id)

    	}

  });

	// !
	$(formularioCobrosFacturas).on('reset', function () {

		fecha.disabled = false;

		metodo_aplicacion.disabled = false;

	});

	// !
	function imprimir(id) {

		const impresion = {
			programa: 'procesos.documentosCxc',
			renglon: 'DOCUMENTO_CXC',
			id: id
		}

		$.ajax({
			type: 'get',
			url: '../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();

			}
		});

	}

})()



