import { formatoNumerico, parametros } from "../../../utilidades.js";
import Tabla from "../../elementos/tabla.js";

// {}
(async () => {

	// ! Declaración de variables
	let
		peticion = { actual: null },
		campo = {
			id_solicitud_pago: {},
			monto: window.aplicacion.campo.mascara.monto,
			debito: window.aplicacion.campo.mascara.debito,
			credito: window.aplicacion.campo.mascara.credito
		},
		tabla = {
			codificacion: {
				elemento: $(tablaRegistrosCodificacion),
				clase: new Tabla({
					tabla: $(tablaRegistrosCodificacion),
					datos: {
						peticion: {
							ruta: `${window.aplicacion.enlace}/ejecutar`,
							parametro: {
								procedimiento: 'p_traer_codificacion',
								renglon: 'SOLICITUD_PAGO',
								id_documento: () => id_solicitud_pago.value
							}
						}
					},
					configuracion: { autoInit: false, dom: `t`, pageLength: -1 }
				}),
				fila: {
					datos: { id_cuenta_contable: '', cuenta_contable: '', debito: 0, credito: 0 }
				}
			},
			facturas: {
				elemento: $(tablaRegistrosFacturas),
				clase: new Tabla({
					tabla: $(tablaRegistrosFacturas),
					datos: {
						peticion: {
							ruta: window.aplicacion.enlace + '/ejecutar',
							parametro: {
								procedimiento: 'p_traer_facturas_para_pagos',
								renglon: 'CXP',
								id_entidad: () => id_entidad.value,
								id_sucursal: () => id_sucursal.value,
								metodo_aplicacion: 'LIBRE',
								monto: () => monto.value
							}
						}
					},
					configuracion: { dom: `ft`, pageLength: -1 }
				})
			}
		},
		pestana = {
			activa: () => $('.tab-pane.active.show'),
			codificacion: { elemento: $('.list-group-item[href="#codificacion"]') },
			facturas: { elemento: $('.list-group-item[href="#facturas"]') }
		},
		ventana = {
			emergente: { inicializador: $(id_beneficiario).parent().find('[data-bs-target]')[0] }
		}

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

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

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

		// +
		if (!this.value)
			return formularioSolicitudesPagos.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: 'SOLICITUD_PAGO',
				id_renglon: this.value
			},
			beforeSend: (peticion, configuracion) => formularioSolicitudesPagos.reset(),
			success: function (respuesta, estado, peticion) { campo.id_solicitud_pago.peticion = true },
			error: function (peticion, estado) { },
			complete: (peticion, estado) => {

				tabla.instancia.ajax.reload()

				botonImprimir.disabled = false;

			},
			campo: { elemento: this },
			formulario: { elemento: formularioSolicitudesPagos }
		});

	});

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

		// +
		pestana.codificacion.elemento.add(pestana.facturas.elemento).addClass('disabled');

		// +
		if (this.value === 'NORMAL') {

			// ?
			monto.disabled = false;

			// ?
			id_beneficiario.name = 'id_cliente';
			beneficiario.name = 'cliente';

			// ?
			ventana.emergente.inicializador.dataset.peticionTabla = 'clientes';
			ventana.emergente.inicializador.dataset.peticionCampo = 'cliente';
			ventana.emergente.inicializador.dataset.ventanaEmergenteTitulo = 'Clientes';

			// ?
			tabla.instancia = tabla.codificacion.instancia;

			// ?
			pestana.codificacion.elemento.removeClass('disabled')[0].click()

		} else {

			// ?
			monto.disabled = true;

			// ?
			id_beneficiario.name = 'id_suplidor';
			beneficiario.name = 'suplidor';

			// ?
			ventana.emergente.inicializador.dataset.peticionTabla = 'suplidores';
			ventana.emergente.inicializador.dataset.peticionCampo = 'suplidor';
			ventana.emergente.inicializador.dataset.ventanaEmergenteTitulo = 'Suplidores';

			// ?
			tabla.instancia = tabla.facturas.instancia;

			// ?
			pestana.facturas.elemento.removeClass('disabled')[0].click()

		}

		// +
		if (!campo.id_solicitud_pago.peticion)
			$('#monto, #id_beneficiario, #tablaRegistrosFacturas').trigger('reset')
		;

		// +
		$(monto).focusout()

	});

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

		// +
		cuenta_beneficiario.disabled = !this.value || this.value === 'CHEQUE'

	});

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

		if (!campo.id_solicitud_pago.peticion && !debito.disabled)
			campo.debito.value = this.value
		;

		campo.id_solicitud_pago.peticion = false;

		tabla.codificacion.fila.datos = {
			id_cuenta_contable: id_cuenta_banco.selectedOptions[0].dataset.cuentaContableId,
			cuenta_contable: id_cuenta_banco.selectedOptions[0].dataset.cuentaContableDescripcion,
			debito: 0,
			credito: campo.monto.typedValue
		};

		$(`#tablaRegistrosCodificacion tbody .id_cuenta_contable:contains(${tabla.codificacion.fila.datos.id_cuenta_contable})`).each((indice, elemento) => {

			if (elemento.textContent === tabla.codificacion.fila.datos.id_cuenta_contable) {

				tabla.codificacion.fila.modificar = elemento.parentElement;

				return false

			}

		});

		if (!tabla.codificacion.fila.modificar)
			return tabla.codificacion.fila.modificar = null
		;

		tabla.codificacion.instancia
			.row(tabla.codificacion.fila.modificar)
			.data(tabla.codificacion.fila.datos)
			.draw(false)
		;

		tabla.codificacion.fila.modificar = null

	});

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

		// + 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: ventana.emergente.inicializador.dataset.peticionCampo,
				id_renglon: this.value
			},
			beforeSend: (peticion, configuracion) => { },
			success: function (respuesta, estado, peticion) { },
			error: function (peticion, estado) { },
			complete: (peticion, estado) => destino.value === 'SUPLIDOR' && tabla.facturas.instancia.ajax.reload(),
			campo: { elemento: this },
			formulario: { elemento: formularioSolicitudesPagos }
		});

	});

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

		if (this.value === id_cuenta_banco.selectedOptions[0].dataset.cuentaContableId) {

			debito.disabled = true;

			campo.debito.value = '0'

		} else
			debito.disabled = false
		;

		destino.value === 'NORMAL' && tabla.codificacion.elemento.trigger('draw')

	});

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

		// +
		let
			formulario = {
				campos: { validar: $(`[name="id_cuenta_contable"], [name="debito"], [name="credito"]`).removeClass('is-invalid') },
			},
			ventana = {
				emergente: { mensaje: '' }
			}

		tabla.codificacion.fila.datos = {
			id_cuenta_contable: id_cuenta_contable.value,
			cuenta_contable: id_cuenta_contable.selectedOptions[0].textContent.trim(),
			debito: campo.debito.typedValue,
			credito: campo.credito.typedValue
		}

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

		// +
		if (!tabla.codificacion.fila.datos.id_cuenta_contable) {

			ventana.emergente.mensaje = '¡TIENES QUE SELECCIONAR UNA CUENTA CONTABLE!';

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

		} else if (!tabla.codificacion.fila.datos.debito && !tabla.codificacion.fila.datos.credito) {

			ventana.emergente.mensaje = '¡TIENES QUE INGRESAR UN DÉBITO O CRÉDITO!';

			window.aplicacion.peticion.formulario.campo.invalido = $('#debito, #credito')

		} else if (tabla.codificacion.fila.datos.debito && tabla.codificacion.fila.datos.credito) {

			ventana.emergente.mensaje = '¡NO PUEDES INGRESAR UN DÉBITO Y CRÉDITO A LA VEZ!';

			window.aplicacion.peticion.formulario.campo.invalido = $('#debito, #credito')

		}

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

		}

		// +
		tabla.codificacion.elemento
			.find(`tbody .id_cuenta_contable:contains(${tabla.codificacion.fila.datos.id_cuenta_contable})`)
			.each((indice, elemento) => {

				if (elemento.textContent === tabla.codificacion.fila.datos.id_cuenta_contable) {

					tabla.codificacion.fila.modificar = elemento.parentElement;

					return false

				}

			})
		;

		// +
		if (tabla.codificacion.fila.modificar) {

			tabla.codificacion.instancia
				.row(tabla.codificacion.fila.modificar)
				.data(tabla.codificacion.fila.datos)
			;

			if (id_cuenta_banco.selectedOptions[0].dataset.cuentaContableId === tabla.codificacion.fila.datos.id_cuenta_contable)
				campo.monto.unmaskedValue = `${tabla.codificacion.fila.datos.credito}`

		} else
			tabla.codificacion.instancia.row.add(tabla.codificacion.fila.datos)
		;

		// +
		tabla.codificacion.instancia.draw(false);

		// +
		formulario.campos.validar.trigger('reset');

		tabla.codificacion.elemento.find('tbody tr.table-active').removeClass('table-active');

		tabla.codificacion.fila.modificar = false

	});

	// !
	tabla.codificacion.elemento
		.find('tbody')
		.unbind('click')
		.on('click dblclick', 'tr', function (evento) {

			// +
			if (tabla.codificacion.elemento.find('td.dataTables_empty').length)
				return
			;

			// +
			tabla.codificacion.fila.datos = tabla.codificacion.instancia.row(this).data();

			// +
			if (evento.type === 'dblclick') {

				$(id_cuenta_contable).val(tabla.codificacion.fila.datos.id_cuenta_contable).change();
				campo.debito.value = `${tabla.codificacion.fila.datos.debito}`.replaceAll(',', '');
				campo.credito.value = `${tabla.codificacion.fila.datos.credito}`.replaceAll(',', '');

				debito.disabled =
					tabla.codificacion.fila.datos.id_cuenta_contable === id_cuenta_banco.selectedOptions[0].dataset.cuentaContableId
				;

				return

			}

			// +
			if (!$(evento.target).closest('.eliminar').length)
				return
			;

			// +
			if (id_cuenta_banco.selectedOptions[0].dataset.cuentaContableId === tabla.codificacion.fila.datos.id_cuenta_contable) {

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

				// ?
				$(ventanaEmergenteAlerta)
					.find('.modal-body p')
					.text('¡NO PUEDES ELIMINAR ESTÁ CUENTA CONTABLE!')
				;

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

			}

			// +
			$(botonAccion).trigger('click', {
				tipo: 'eliminar',
				funcion: () =>
					$(evento.delegateTarget).closest('table').DataTable().row(this).remove().draw(false)
			});

		})
	;

	// !
	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.codificacion.elemento.on('draw.dt', function (evento) {

		tabla.codificacion.pie = {
			diferencia: tabla.codificacion.instancia.column('.diferencia').footer(),
			datos: {
				debito: Number(
					tabla.codificacion.instancia.column('.debito').footer().textContent.replaceAll(',', '')
				),
				credito: Number(
					tabla.codificacion.instancia.column('.credito').footer().textContent.replaceAll(',', '')
				)
			}
		};

		// +
		tabla.codificacion.pie.diferencia.classList.add('text-end');
		tabla.codificacion.pie.diferencia.textContent = `
			Diferencia: ${formatoNumerico(tabla.codificacion.pie.datos.debito - tabla.codificacion.pie.datos.credito, 2)}
		`

	});

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

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

		formulario.peticion.parametros.append('beneficiario', beneficiario.value);

		if (pestana.activa().attr('id') === 'codificacion') {

			tabla.temporal = { instancia: tabla.codificacion.instancia }

		} else
			tabla.temporal = { instancia: tabla.facturas.instancia, condicion: ':has(input:checked)' }
		;

		formulario.peticion.parametros.append(
			'json_detalle_solicitud',
			JSON.stringify(tabla.temporal.instancia.rows(tabla.temporal.condicion).data().toArray().map(valor => ({
				id_cuenta_contable: Number(valor.id_cuenta_contable) ?? 0,
				debito: Number(valor.debito ?? 0),
				credito: Number(valor.credito ?? 0),
				id_factura: Number(valor.id_factura ?? 0),
				monto: Number(valor.aplicado ?? 0),
				descuento: Number(0)
			})))
		);

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

	});

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

		if(id_solicitud_pago.value)
			imprimir(id_solicitud_pago.value)
		;

	});

	// !
	$(document).on('ajaxSuccess', async (evento, peticion, configuracion) => {

		configuracion.parametros = new URLSearchParams(configuracion.url);

		configuracion.parametros.get('procedimiento') === 'p_registrar_solicitudes_pagos' &&
		configuracion.parametros.get('renglon') === 'guardar' &&
		imprimir(peticion.responseJSON[0].id_registro)

	});

	// !
	function imprimir(id) {

		$.ajax({
			url: '../impresion',
			data: {
				programa: 'procesos.solicitudPago',
				renglon: 'SOLICITUD_PAGO',
				id: id
			},
			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();

			}
		});

	}

})()
