// {} Librerías e importaciones

// ! Tabla
import { 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: {},
			documento: {},
			monto: window.aplicacion.campo.mascara.monto,
			montoCheque: window.aplicacion.campo.mascara.montoCheque
		},
		formulario = {
			avances: { elemento: $(formularioAvances) }
		},
		tabla = {
			avances: {
				elemento: $(tablaRegistros),
				clase: new Tabla({
					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()
							}
						}
					},
					configuracion: { dom: `ft`, pageLength: -1 }
				})
			},
			cheques: {
				elemento: $(tablaRegistrosDetalleCheques),
				clase: new Tabla({
					tabla: tablaRegistrosDetalleCheques,
					datos: {
						peticion: {
							ruta: `${window.aplicacion.enlace}/ejecutar`,
							parametro: {
								procedimiento: 'p_traer_cheques_documento',
								id_documento: () => !id_documento.value ? -1 : id_documento.value
							}
						}
					},
					configuracion: { dom: `t` }
				}),
				fila: {}
			}
		},
		ventana = {
			emergente: {
				inicializador: id_entidad.closest('.input-group').querySelector('[data-bs-target]')
			}
		},
		fila = null
	;

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

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

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

		if (!campo.documento.valor)
			formularioAvances.reset()
		;

		if (!this.value) {

			documento.value = null;

			ventana.emergente.inicializador.disabled = true;
			id_entidad.disabled = true;

			campo.id_entidad.etiqueta.textContent = ''

			return

		}

		ventana.emergente.inicializador.disabled = false;
		id_entidad.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'

		}

		peticion.actual = $.ajax({
			url: `${window.aplicacion.enlace}/ejecutar`,
			data: {
				procedimiento: 'p_traer_secuencias',
				renglon: 'AVANCES',
				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) {

				if (campo.documento.valor) {

					documento.value = campo.documento.valor;

					campo.documento.valor = null

				}

			},
			formulario: { elemento: formularioAvances }
		})

	});

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

		// +
		if (!this.value)
			return formularioAvances.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) => formularioAvances.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: (peticion, estado) => $(tablaRegistros).DataTable().ajax.reload()
		})

	});

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

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

		if (this.value === 'CHEQUE') {

			botonCheque.classList.remove('d-none');
			tabla.cheques.instancia.clear().draw()

		} else
			botonCheque.classList.add('d-none')

	});

	// !
	$(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(montoCheque.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 = $('#montoCheque')

		}

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

			formularioCheques.reset();

			return false
		}

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

		formularioCheques.reset();

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

	});

	// !
	formulario.avances.elemento.on('reset', function(evento) {

		$(tipo_avance).trigger('change')

	});

	// !
	tabla.avances.elemento.find('tbody').on('dblclick', 'tr', 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: 'AVANCE',
				id_renglon: $(evento.currentTarget).find('.id').text()
			},
			beforeSend: function(peticion, configuracion) {},
			success: function(respuesta, estado, peticion) {

				if (!respuesta.length)
					return
				;

				respuesta = respuesta[0];

				campo.documento.valor = respuesta.documento

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

				if (evento.target.textContent === 'CHEQUE') {

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

					$(ventanaEmergenteCheque).modal('show')

				}

			},
			formulario: { elemento: formularioAvances }
		})

	});

	// !
	$(ventanaEmergenteCheque).on('show.bs.modal', function(evento) {

		if (campo.documento.valor) {

			formularioCheques.querySelector('.row').classList.add('d-none');
			tabla.cheques.instancia.column('[data-columna-tipo=eliminar]').visible(false)

		} else {

			formularioCheques.querySelector('.row').classList.remove('d-none');
			tabla.cheques.instancia.column('[data-columna-tipo=eliminar]').visible(true)

		}

	})

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

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

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

		// +
		numero_cheque.value = tabla.cheques.fila.datos.numero_cheque;
		$(id_banco).val(tabla.cheques.fila.datos.id_banco).change();
		campo.montoCheque.typedValue = tabla.cheques.fila.datos.monto;
		beneficiario.value = tabla.cheques.fila.datos.beneficiario

	});

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

		campo.monto.value = tabla.cheques.instancia.column('.monto').footer().textContent

	});

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

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

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

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

	});

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

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

				$(tablaRegistros).DataTable().ajax.reload();

				imprimir(window.aplicacion.peticion.formulario.exitosa.propiedades.responseJSON[0].id_registro)

			}

	});

	function imprimir(id) {

		const impresion = {
			programa: 'procesos.avances',
			renglon: 'AVANCE',
			id: Number(id),
			generico: 0
		}

		$.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();

			}
		});

	}

})()
