// {} Librerías e importaciones

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

// ! Parametros
import { parametros } from "../../../utilidades.js";

// {}
(() => {

  // ! Declaración de variables
  let
		peticion = {
			actual: null,
			parametro: new URLSearchParams(location.search).get('id_cliente')
		},
		campo = { numero_cuenta: window.aplicacion.campo.mascara.numero_cuenta }

	// !
	new Tabla({
		datos: {
			peticion: {
				ruta: `${window.aplicacion.enlace}/ejecutar`,
				parametro: {
					procedimiento: 'p_traer_datos_entidad',
					renglon: 'CUENTAS_BANCOS',
					id_renglon: id_cliente.value
				}
			}
		},
		configuracion: { dom: `t`, pageLength: -1 }
	}).inicializar();

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

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

				$(tablaRegistros)
					.dataTable()
					.fnSettings()
					.ajax
					.data
					.id_renglon = id_entidad.value
				;

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

				$(id_relacion).trigger('focusout');

			},
      campo: { elemento: this },
      formulario: { elemento: formularioClientes }
    })

  });

	// !
	if (peticion.parametro) {

		// + 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',
				id_renglon: peticion.parametro
			},
			beforeSend: function(peticion, configuracion) {},
			success: function(respuesta, estado, peticion) {},
			error: function(peticion, estado) {},
			complete: function(peticion, estado) {},
			formulario: { elemento: formularioClientes }
		})

	}

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

		// +
		if (!this.value)
			return
		;

		// + 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: 'RELACIONADO',
				id_renglon: this.value
			},
			beforeSend: function(peticion, configuracion) { },
			success: function(respuesta, estado, peticion) {

				if(!respuesta.length)
					return
				;

				respuesta = respuesta[0]

				id_relacion.value = respuesta.id_relacionado;
				relacionado.value = respuesta.relacionado;

			},
			error: function(peticion, estado) {},
			complete: function(peticion, estado) {},
			campo: { elemento: this },
		})

	});

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

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

    // +
    formulario.peticion.parametro.append(
      'json_cuentas_bancos',
      JSON.stringify($(tablaRegistros).DataTable().data().toArray().map((valor, iteracion) => {

        valor.id_banco = Number(valor.id_banco);
        valor.id_entidad = Number(valor.id_entidad);

        return valor

      }))
    );

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

	});

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

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

		let formulario = {
			campos: {
				contenedor: function() { return this.validar.closest('.row') },
				validar: $('[name="id_banco"], [name="id_tipo_cuenta_banco"], [name="numero_cuenta"]')
			}
		},
		tabla = {
			datos: {
				id_entidad: id_entidad.value,
				id_banco: id_banco.value,
				banco: $('#id_banco option:selected').text().trim(),
				tipo_cuenta: $('#id_tipo_cuenta_banco option:selected').text().trim(),
				cuenta_banco_entidad: numero_cuenta.value,
				referencia: referenciaCuentaBanco.value
			},
			modificar: null
		}

		// +
		formulario.campos.contenedor().find('.is-invalid').removeClass('is-invalid');

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

		// +
		formulario.campos.validar.each((indice, elemento) => {

			elemento.value = elemento.value.trim();

			if (!elemento.value) {

				$('#ventanaEmergenteAlerta .modal-body p').text(
					`¡El ${elemento.name.replaceAll('id_', '').replaceAll('_', ' de ')} es obligatorio!`
				);

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

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

				return false

			}

			if (elemento.name === 'numero_cuenta')
				$(`#tablaRegistros tbody .numero_cuenta:contains(${elemento.value})`).each((valor, indice) => {

					indice.textContent = indice.textContent.trim();

					if (indice.textContent === elemento.value) {

						tabla.modificar = indice.parentElement
						return false;

					}

				})

		});

		if (formulario.campos.contenedor().find('.is-invalid').length)
			return
		;

		if (tabla.modificar) {
			$(tablaRegistros).DataTable().row(tabla.modificar).data(tabla.datos).draw(false);
		} else {
			$(tablaRegistros).DataTable().row.add(tabla.datos).draw(false);
		}

		formulario.campos.validar.add('#referenciaCuentaBanco').trigger('reset')

	});

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

		peticion.actual && peticion.actual.abort()

	});

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

		// !
		if(id_cliente.value){

			// +
			imprimir(id_cliente.value);

		}

	});

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

		// +
		let datos = $(tablaRegistros).DataTable().row(this).data();

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

			$(id_banco).val(datos.id_banco).change();
			$(id_tipo_cuenta_banco).val(datos.tipo_cuenta).change()
			campo.numero_cuenta.value = datos.cuenta_banco_entidad
			referenciaCuentaBanco.value = datos.referencia

			return

		}

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

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

	});

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

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

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

			}
	});

	// !
	function imprimir(id) {

		const impresion = {
			programa: 'registros.clientes',
			renglon: 'CLIENTE',
			id: id,
			generico: 0
		}

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

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

			}
		});

	}

})()
