// {} Librerías e importaciones

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

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

// {}
(async () => {

  // ! Declaración de variables
  let
    peticion = { actual: null },
    campo = {
			tasa_interes: window.aplicacion.campo.mascara.tasa_interes,
			monto: window.aplicacion.campo.mascara.monto,
			interes_mensual: window.aplicacion.campo.mascara.interes_mensual,
			id_cliente: window.aplicacion.campo.mascara.id_cliente,
			identificacion: null
    },
		tabla = {
			certificados: {
				elemento: $(tablaRegistros),
				clase: new Tabla({
					columna: {
						peticion: {
							ruta: `${window.aplicacion.enlace}/ejecutar`,
							parametro: { procedimiento: 'p_traer_encabezado_registros' }
						}
					},
					datos: {
						peticion: {
							ruta: `${window.aplicacion.enlace}/ejecutar`,
							parametro: { procedimiento: 'p_traer_certificados' }
						}
					},
					configuracion: { dom: `ft`, pageLength: -1 }
				})
			},
			relacionados: {
				elemento: $(tablaRegistrosRelacionados),
				clase: new Tabla({
					tabla: tablaRegistrosRelacionados,
					datos: {
						peticion: {
							ruta: `${window.aplicacion.enlace}/ejecutar`,
							parametro: {
								procedimiento: 'p_traer_cuentas_relacionados',
								id_cuenta: () => !id_cliente.value ? -1 : id_cliente.value
							}
						}
					},
					configuracion: {
						dom: `t`,
						pageLength: -1
					}
				})
			}
		}
	;

	await tabla.certificados.clase.inicializar();
	tabla.certificados.instancia = tabla.certificados.elemento.DataTable();

	await tabla.relacionados.clase.inicializar();
	tabla.relacionados.instancia = tabla.relacionados.elemento.DataTable();


  // !
	$.ajax({
		url: `${window.aplicacion.enlace}/ejecutar`,
		data: {
			procedimiento: 'p_traer_fechas',
      renglon: 'FECHA_ACTUAL'
		},
		success: function (respuesta) {

			respuesta = respuesta[0];

			$.each(respuesta, (indice, valor) => respuesta[indice] = respuesta[indice].split(' ')[0]);

			fecha.value = respuesta.fecha;
			fecha.min = respuesta.fecha_minima;
			fecha.max = respuesta.fecha_maxima

		}
	});

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

    // +
    if (!this.value)
      return formularioCertificados.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) { formularioCertificados.reset() },
      success: function(respuesta, estado, peticion) {

				if(!respuesta)
					return
				;

				respuesta = respuesta[0];

				campo.id_cliente.value = respuesta.id_cliente;
				cliente.value = respuesta.cliente;
				id_oficial.value = respuesta.id_oficial;

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

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

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

				$(id_oficial).trigger('change')
			},
      campo: { elemento: this }
    })

  });

	// !
	$(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) { campo.identificacion = respuesta[0].identificacion},
			error: function(peticion, estado) {},
			complete: function(peticion, estado) {},
			campo: { elemento: this },
			formulario: { elemento: formularioCertificados }
		})

	});

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

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

	});

  // !
  $('#id_tipo_tasa, #tasa_interes, #monto').on('select2:select input', function(evento) {

    campo.interes_mensual.value = (
      campo.monto.unmaskedValue * ((campo.tasa_interes.unmaskedValue / 12) / 100)
    ).toString()

  });

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

    let fecha = $('#fecha').val().split('-');

    fecha = new Date(`${fecha[1]}-${fecha[2]}-${fecha[0]}`);

    fecha.setMonth(fecha.getMonth() + Number(this.value));

    fecha_finalizar.value = fecha.toLocaleDateString('en-CA')

  });

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

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

		formulario.peticion.parametros.append(
			'json_relacionados',
			JSON.stringify($(tablaRegistrosRelacionados).DataTable().data().toArray().map((valor,iteracion) => {

				valor.id_relacion = Number(valor.id_relacion)
				valor.id_tipo_relacion = Number(valor.id_tipo_relacion)

				return valor

			}))
		);

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

	});

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

		let formulario = {
			campos: {
				contenedor: function() { return this.validar.closest('.row') },
				validar: $('[name="id_relacion"],[name="relacionado"],[name="id_tipo_relacion"]')
			}
		},
		tabla = {
			datos: {
				id_relacion: id_relacion.value,
				relacionado: relacionado.value,
				identificacion: campo.identificacion,
				id_tipo_relacion: id_tipo_relacion.value,
				tipo_relacion: id_tipo_relacion.selectedOptions[0].textContent.trim(),
			},
			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 === 'id_relacion')

				$(`#tablaRegistrosRelacionados tbody .id_relacion: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) {
			$('#tablaRegistrosRelacionados').DataTable().row(tabla.modificar).data(tabla.datos).draw(false);
		} else {
			$('#tablaRegistrosRelacionados').DataTable().row.add(tabla.datos).draw(false);
		}

		formulario.campos.validar.trigger('reset')

	});

	// !
  $('#tablaRegistros 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: 'CERTIFICADO',
        referencia: $(evento.currentTarget).find('.id').text()
      },
      beforeSend: function(peticion, configuracion) {},
      success: function(respuesta, estado, peticion) {},
      error: function(peticion, estado) {},
      complete: function(peticion, estado) {},
      formulario: { elemento: formularioCertificados }
    })

  });

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

		const datos = $('#tablaRegistrosRelacionados').DataTable().row(this).data();

		$(id_relacion).val(datos.id_relacion);
		$(relacionado).val(datos.relacionado);
		$(id_tipo_relacion).val(datos.id_tipo_relacion).change();
		campo.identificacion = datos.identificacion;

	});

})()
