// {} Librerías e importaciones

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


// {}
(async () => {

	// ! Declaración de variables
	let
		peticion = { actual: null },
		campo = {
			id_entidad: {
				primario: document.querySelector('[name=id_entidad]'),
				etiqueta: id_entidad.previousElementSibling
			},
			tipo_avance: {},
			monto: window.aplicacion.campo.mascara.monto
		},
		tabla = {
			avances: {
				elemento: $(tablaRegistrosAvances),
				clase: new Tabla({
					tabla: tablaRegistrosAvances,
					columna: {
						peticion: {
							ruta: `${window.aplicacion.enlace}/ejecutar`,
							parametro: { procedimiento: 'p_traer_encabezado_procesos' }
						}
					},
					datos: {
						peticion: {
							ruta: `${window.aplicacion.enlace}/ejecutar`,
							parametro: {
								procedimiento: 'p_traer_avances_entidad',
								id_entidad: () => !$('[name="id_entidad"]').val() ? -1 : $('[name="id_entidad"]').val(),
								hasta_fecha: () => fecha.value
							}
						}
					},
					configuracion: { dom: `t`, scrollY: '35vh', pageLength: -1 }
				}),
			},
			facturas: {
				elemento: $(tablaRegistrosFacturas),
				clase: new Tabla({
					tabla: tablaRegistrosFacturas,
					columna: {
						peticion: {
							ruta: `${window.aplicacion.enlace}/ejecutar`,
							parametro: { procedimiento: 'p_traer_encabezado_procesos', renglon: 'FACTURAS' }
						}
					},
					datos: {
						peticion: {
							ruta: `${window.aplicacion.enlace}/ejecutar`,
							parametro: {
								procedimiento: 'p_traer_facturas_para_pagos',
								renglon: () => tipo_avance.value === '51' ? 'CXC' : 'CXP',
								id_entidad: () => document.querySelector('[name=id_entidad]').value,
								id_sucursal: () => 1,
								metodo_aplicacion: 'LIBRE',
								monto: () => monto.value
							}
						}
					},
					configuracion: { dom: `t`, scrollY: '35vh' }
				}),
				actualizar: () => {

					tabla.facturas.pie = {
						concepto: {
							elemento: tabla.facturas.instancia.column('[data-columna-nombre=concepto]').footer()
						},
						aplicado: {
							elemento: tabla.facturas.instancia.column('[data-columna-nombre=aplicado]').footer(),
							valor: () => Number(tabla.facturas.pie.aplicado.elemento.textContent.replaceAll(',', ''))
						}
					};

					monto.disponible = campo.monto.typedValue;

					tabla.facturas.instancia.data().each((datos, iteracion) => {

						if (monto.disponible) {

							datos.aplicado = monto.disponible < Number(datos.balance)
								? monto.disponible
								: Number(datos.balance)
							;

							datos.aplicado = datos.aplicado.toFixed(2);

							monto.disponible -= datos.aplicado

						} else
							datos.aplicado = '0.00'
						;

						tabla.facturas.instancia.row(iteracion).data(datos)

					})

				}
			}
		},
		ventana = {
			emergente: { inicializador: entidad.nextElementSibling }
		},
		monto = {}
	;

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

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

	// !
	$(tipo_avance).on('change select2:select', function(evento) {

		// +
		if (evento.type === 'select2:select')
			return formularioAplicarAvances.reset()
		;

		if (!this.value) {

			campo.id_entidad.primario.value = null;
			campo.id_entidad.etiqueta.textContent = '';
			id_entidad.disabled = true;
			ventana.emergente.inicializador.disabled = true;

			return

		}

		// +
		id_entidad.disabled = false;
		ventana.emergente.inicializador.disabled = false;

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

			// ?
			campo.id_entidad.etiqueta.textContent = 'Cliente';
			id_entidad.name = 'id_cliente';
			entidad.name = 'cliente';

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

		} else {

			// ?
			campo.id_entidad.etiqueta.textContent = 'Suplidor';
			id_entidad.name = 'id_suplidor';
			entidad.name = 'suplidor';

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

		}

	});

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

		// +
		if (!this.value)
			return $([
				campo.id_entidad.primario,
				id_entidad,
				tablaRegistrosAvances,
				tablaRegistrosFacturas
			]).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: ventana.emergente.inicializador.dataset.peticionCampo,
				id_renglon: this.value
			},
			beforeSend: (peticion, configuracion) => $([campo.id_entidad.primario, id_entidad]).trigger('reset'),
			success: function(respuesta, estado, peticion) {

				if (!respuesta.length)
					return
				;

				respuesta = respuesta[0];

				campo.id_entidad.primario.value = respuesta.id_entidad;
				window.aplicacion.campo.mascara.id_entidad.value = respuesta[id_entidad.name];
				entidad.value = respuesta[entidad.name]

			},
			error: function(peticion, estado) {},
			complete: async (peticion, estado) => {

				tabla.avances.instancia.ajax.reload();

				tabla.facturas.instancia.ajax.reload()

			}
		})

	});

	// !
	$(campo.monto.el.input).on('focusout', function(evento) {

		if (!tabla.avances.pie)
			return
		;

		if (campo.monto.typedValue !== tabla.avances.pie.aplicado.valor()) {

			monto.disponible = campo.monto.typedValue;

			tabla.avances.instancia.data().each((datos, iteracion) => {

				if (monto.disponible) {

					datos.aplicado = monto.disponible < Number(datos.balance)
						? monto.disponible
						: Number(datos.balance)
					;

					datos.aplicado = datos.aplicado.toFixed(2);

					monto.disponible -= datos.aplicado

				} else
					datos.aplicado = '0.00'
				;

				tabla.avances.instancia.row(iteracion).data(datos)

			});

			tabla.avances.instancia.draw()

		}

		tabla.facturas.actualizar()

	});

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

		tabla.facturas.actualizar()

	});

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

		tabla.facturas.actualizar()

	});

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

		if (this === tabla.avances.elemento[0]) {

			tabla.avances.pie = {
				aplicado: {
					elemento: tabla.avances.instancia.column('[data-columna-nombre=aplicado]').footer(),
					valor: () => Number(tabla.avances.pie.aplicado.elemento.textContent.replaceAll(',', ''))
				}
			}

			campo.monto.typedValue = tabla.avances.pie.aplicado.valor();

			return

		}

		campo.monto.typedValue = tabla.facturas.pie.aplicado.valor();

		campo.monto.el.input.dispatchEvent(new Event('blur'));

		tabla.facturas.pie.concepto.elemento.classList.add('fw-bold');
		tabla.facturas.pie.concepto.elemento.classList.add('text-end');
		tabla.facturas.pie.concepto.elemento.classList.add('text-decoration-underline');
		tabla.facturas.pie.concepto.elemento.textContent = `
			Disponible: ${formatoNumerico(campo.monto.typedValue - tabla.facturas.pie.aplicado.valor(), 2)}
		`

	});

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

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

    formulario.peticion.parametros.append(
      'json_detalle_avances',
      JSON.stringify(
				tabla.avances.instancia.data()
					.filter(valor => Number(valor.aplicado))
					.toArray().map(valor => ({
						id_documento: Number(valor.id_documento),
						monto: Number(valor.aplicado)
					}))
			)
    );

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

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

	});

	// !
	$(fecha).on('focusout', function () {

		tabla.avances.instancia.ajax.reload();

		tabla.facturas.instancia.ajax.reload()

	});

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

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

		configuracion.parametros.get('../ejecutar?procedimiento') === 'p_traer_avances_entidad' &&
		tabla.facturas.instancia.ajax.reload()

	});

	function imprimir(id) {

		const impresion = {
			programa: 'procesos.avances',
			renglon: 'AVANCE',
			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();

			}
		});

	}

})()
