// {} Librerías e importaciones

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

// {}
(async () => {

  // ! Declaración de variables
  let
    peticion = {
			actual: null
		},
    campo = {
			id_renglon: window.aplicacion.campo.selector.id_renglon,
			id_cliente: window.aplicacion.campo.mascara.id_cliente,
			id_tipo_tasa: window.aplicacion.campo.selector.id_tipo_tasa,
			monto_cuota: window.aplicacion.campo.mascara.monto_cuota,
			montoDeduccion: window.aplicacion.campo.mascara.montoDeduccion,
			monto_deducciones: window.aplicacion.campo.mascara.monto_deducciones
		},
		tabla = {
			solicitudes: {
				elemento: $(tabla_solicitudes),
				clase: new Tabla({
					tabla: tabla_solicitudes,
					columna: {
						peticion: {
							ruta: `${window.aplicacion.enlace}/ejecutar`,
							parametro: { procedimiento: 'p_traer_encabezado_procesos' }
						}
					},
					datos: {
						peticion: {
							ruta: `${window.aplicacion.enlace}/ejecutar`,
							parametro: {
								procedimiento: 'p_traer_datos_entidad',
								renglon: 'SOLICITUDES_PRESTAMOS',
								id_renglon: () => !id_cliente.value ? -1 : id_cliente.value
							}
						}
					},
					configuracion: { dom: `ft`, pageLength: -1 }
				})
			},
			renegociacion: {
				elemento: $(tabla_renegociacion),
				clase: new Tabla({
					tabla: tabla_renegociacion,
					columna: {
						peticion: {
							ruta: `${window.aplicacion.enlace}/ejecutar`,
							parametro: {
								procedimiento: 'p_traer_encabezado_procesos',
								renglon: 'RENEGOCIACION'
							}
						}
					},
					datos: {
						peticion: {
							ruta: `${window.aplicacion.enlace}/ejecutar`,
							parametro: {
								procedimiento: 'p_traer_cuentas_relacionados',
								id_solicitud: () => !id_solicitud.value ? -1 : id_solicitud.value
							}
						}
					},
					configuracion: {
						dom: `ft`,
						pageLength: -1
					}
				}),
			},
			deducciones: {
				elemento: $(tabla_deducciones),
				clase: new Tabla({
					tabla: tabla_deducciones,
					// datos: {
					// 	peticion: {
					// 		ruta: `${window.aplicacion.enlace}/ejecutar`,
					// 		parametro: {
					// 			procedimiento: '',
					// 			renglon: ''
					// 		}
					// 	}
					// },
					configuracion: { autoInit: false, dom: `t`, pageLength: -1 },
				})
			},
		}
	;

	// !
	$('table').on('draw.dt', function(evento) {

		evento.id = evento.tabla.id.replace('tabla_', '');

		if (!tabla[evento.id])
			return
		;

		evento.tabla.clase  = tabla[evento.id].clase;
		tabla[evento.id] = evento.tabla

	});

	// !
	await tabla.solicitudes.clase.inicializar();

	// !
	await tabla.renegociacion.clase.inicializar();

	// !
	await tabla.deducciones.clase.inicializar();

	// !
	$.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 $([id_cliente, cliente, id_entidad]).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: 'CLIENTE',
				filtro: 'CLIENTE_NOMBRE',
        id_renglon: this.value
      },
      beforeSend: function(peticion, configuracion) { $([id_cliente, cliente, id_entidad]).trigger('reset') },
      success: function(respuesta, estado, peticion) {},
      error: function(peticion, estado) {},
      complete: function(peticion, estado) {

				tabla.solicitudes.instancia.ajax.reload();
			},
      campo: { elemento: this },
			formulario: { elemento: formularioSolicitudes }
    })

  });

	// !
	$(id_solicitud).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: 'SOLICITUD_PRESTAMO',
				id_renglon: this.value
			},
			beforeSend: (peticion, configuracion) => {},
			success: async function (respuesta, estado, peticion) {

				// +
				if(!respuesta.length)
				return formularioSolicitudes.reset();

				// +
				respuesta = respuesta[0]

				// +
				id_tipo_cuenta.value = respuesta.id_tipo_cuenta;

				// +
				campo.id_renglon.parametros();
				await campo.id_renglon.peticion('opciones');

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

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

				$(id_cliente).trigger('focusout')

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

	});

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

		// +
		campo.id_renglon.parametros();
		campo.id_renglon.peticion('opciones');

  });

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

		// +
		campo.id_tipo_tasa.parametros();
		campo.id_tipo_tasa.peticion('opciones');

	});

	// !
	$('#tasa_seguro,#tiempo,#tasa_interes,#monto,#tasa_comision').on('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: {
        funcion: 'f_monto_cuota',
				id_tipo_calculo: id_tipo_calculo.value,
        monto: monto.value,
				tiempo: tiempo.value,
        tasa_interes: tasa_interes.value,
				tasa_comision: tasa_interes.value,
				tasa_seguro: tasa_seguro.value,
				renglon: ''
      },
      beforeSend: function(peticion, configuracion) { monto_cuota.value = '' },
      success: function(respuesta, estado, peticion) {

				if(!respuesta.length)
					return

				campo.monto_cuota.value = respuesta[0][""]
			},
      error: function(peticion, estado) {},
      complete: function(peticion, estado) {},
      campo: { elemento: this }
    })

	});

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

		$(id_solicitud).val($(this).find('.id').text()).focusout();

		$('.list-group a[href="#datosSolicitud"]').tab('show');

	});

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

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

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

  });

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

		window.open(
			`${window.aplicacion.enlace}/registros/clientes?id_cliente=${id_cliente.value}`,
			'',
			`width = 992, height = 600, left = ${(window.screen.width - 992) / 2}, top = ${(window.screen.height - 600) / 2}`,
		);

	});

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

		// +
		let
			datos_deducciones = {
				deduccion: deduccion.value,
				monto: campo.montoDeduccion.typedValue
			},
			ventana = {
				emergente: { mensaje: '' }
			},
			formulario = {
				campos : { validar: $(`[name="deduccion"],[name="monto"]`).removeClass('is-invalid') }
			},
			fila = null
		;

		// +
		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_deducciones.deduccion)
		{
			ventana.emergente.mensaje = 'NO PUEDES DEJAR LA DEDUCCIÓN VACÍA.'

			window.aplicacion.peticion.formulario.campo.invalido = $('#deduccion')
		}
		else if(!datos_deducciones.monto)
		{
			ventana.emergente.mensaje = 'NO PUEDES DEJAR EL MONTO EN BLANCO.'

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

		}

		// +
		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 = $(`#tabla_cheques tbody .deduccion:contains(${deduccion.value})`);

		// +
		if (fila.length > 0 && fila[0].textContent === fila.deduccion) {

			tabla.deducciones.instancia.row(fila).data(datos_deducciones).draw(false);

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

		// +
		tabla.deducciones.instancia.row.add(datos_deducciones).draw(false);

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

		// +
		campo.monto_deducciones.value = tabla.deducciones.instancia.column('[data-columna-nombre=monto]').footer().textContent;
	});

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

		imprimir(id_solicitud.value)

	});

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

    if (
      window.aplicacion.peticion.formulario.elemento === formularioSolicitudes &&
      window.aplicacion.peticion.formulario.exitosa.propiedades === window.aplicacion.peticion.exitosa.propiedades &&
			new URLSearchParams(window.aplicacion.peticion.exitosa.configuracion.url).get('renglon') === 'guardar'
    )
			tabla.solicitudes.instancia.ajax.reload()
		;
  });

	function imprimir(id) {

		const impresion = {
			programa: 'procesos.solicitudPrestamo',
			renglon: 'SOLICITUD_PRESTAMO',
			id: Number(id)
		}

		$.ajax({
			type: 'get',
			url: `${window.aplicacion.enlace}/impresion`,
			data: impresion,
			dataType: 'JSON',
			success: 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();

			}
		});

	}

})()
