// {} Librerías e importaciones

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

// {}
(async () => {

  // ! Declaración de variables
  let
    peticion = {
      actual: null
    },
    campo = {
			monto: window.aplicacion.campo.mascara.monto,
			itbis: window.aplicacion.campo.mascara.itbis,
			monto_isr: window.aplicacion.campo.mascara.monto_isr,
			monto_retencion: window.aplicacion.campo.mascara.monto_retencion,
			propina_legal: window.aplicacion.campo.mascara.propina_legal,
			impuesto_selectivo: window.aplicacion.campo.mascara.impuesto_selectivo,
			tasa: window.aplicacion.campo.mascara.tasa,
			condicion: window.aplicacion.campo.mascara.condicion,
			id_suplidor: window.aplicacion.campo.mascara.id_suplidor,
			credito: window.aplicacion.campo.mascara.credito,
			debito: window.aplicacion.campo.mascara.debito,
			subtotal: window.aplicacion.campo.mascara.subtotal
    },
		formulario = {
			campos: $([ncf, monto, referencia, id_clasificacion_fiscal, itbis, id_tipo_comprobante, concepto, id_factura, subtotal, tablaRegistrosCodificacion]),
		},
		valor = {
			credito: 0,
			debito: 0,
			diferencia: 0
		},
		tabla = {
			facturas: {
				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_facturas_entidad',
								id_entidad: () => !id_entidad.value ? -1 : id_entidad.value,
							}
						}
					},
					configuracion: {
						dom: `ft`,
						pageLength: -1
					}
				}),
			},
			codificacion: {
				elemento: $(tablaRegistrosCodificacion),
				clase: new Tabla({
					tabla: $(tablaRegistrosCodificacion),
					datos: {
						peticion: {
							ruta: `${window.aplicacion.enlace}/ejecutar`,
							parametro: {
								procedimiento: 'p_traer_codificacion',
								renglon: 'CXP',
								id_documento: () => !id_factura.value ? -1 : id_factura.value
							}
						}
					},
					configuracion: { dom: `t`, pageLength: -1 }
				}),
				fila: {
					datos: { id_cuenta_contable: '', cuenta_contable: '', debito: 0, credito: 0 }
				}
			}
		},
		suma = 0,
		total_pagar = 0
	;

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

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

	// !
	setTimeout(() => {
		$(id_tipo_comprobante).trigger('change')
	}, 0);

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

    // +
    if (!this.value)
			return formulario.campos.add('#numero_factura').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: 'SUPLIDOR',
        id_renglon: this.value
      },
      beforeSend: function(peticion, configuracion) {
				formulario.campos.add('#numero_factura,#identificacion,#suplidor,#id_suplidor,#id_entidad').trigger('reset')
			},
      success: function(respuesta, estado, peticion) {

        if (!respuesta.length) return;

				respuesta = respuesta[0]

				campo.id_suplidor.value = respuesta?.id_suplidor;
				suplidor.value = respuesta?.suplidor;
				id_entidad.value = respuesta?.id_entidad;
				id_cuenta_contable_cuenta.value = respuesta?.id_cuenta_contable_cuenta;
				cuenta_contable.value = respuesta?.cuenta_contable;
				campo.condicion.value = respuesta?.condicion;

			},
      error: function(peticion, estado) {},
      complete: function(peticion, estado) { tabla.facturas.instancia.ajax.reload() },
      campo: { elemento: this }
    })

  });

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

		// +
		if (!this.value)
			{
				fecha.value = fecha.max;
				formulario.campos.trigger('reset')
				desactivarCampos(true)
			}
		;

		// + 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_factura_entidad',
				renglon: 'SUPLIDOR',
				id_entidad: id_entidad.value,
				numero_factura: numero_factura.value
			},
			beforeSend: function(peticion, configuracion) { formulario.campos.trigger('reset') },
			success: function(respuesta, estado, peticion) {},
			error: function(peticion, estado) {},
			complete: function(peticion, estado) {

				$('#tablaRegistros').trigger('draw');

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

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

			},
			formulario: { elemento: formularioEntradasFacturasCXP }
		})

	});

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

		if (!id_factura.value) {

			if (this.value === '5' || this.value === '4') {
				$('#ncf').val('B13123456788');
				$(ncf).trigger('focusout');
				ncf.disabled = true;
			}

			else if (this.value === '1') {
				ncf.disabled = true;
				ncf.value = '';
				$(ncf).trigger('focusout');
			}

			else if (this.value === '') {
				ncf.disabled = true;
				ncf.value = '';
			}

		}

	});

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

		if (this.value.length > 1) {
			ncf.disabled = false;
			desactivarCampos(false);
		}
		else if(this.value.length < 1 && !id_factura.value){
			desactivarCampos(true,true);
		}

	});

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

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

		// +
		if(ncf.value) {
			campo.itbis.value = Number((this.value.replaceAll(',','') / 100) * 18).toString();
		}

	});

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

		actualizarRetencion(evento)

		monto_isr.disabled = this.value === '';

	});

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

		actualizarRetencion(evento)

	});

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

		actualizarRetencion(evento)

		monto_retencion.disabled = this.value === '';

	});

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

		actualizarRetencion(evento)

	});

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

		if(Number(this.value.replaceAll(',','')) > Number((((subtotal.value).replaceAll(',','') / 100) * 18) + 5))
		{
			// +
			$('#ventanaEmergenteAlerta .modal-header')
				.removeClass('bg-success')
				.addClass('bg-danger')
			;

			$('#ventanaEmergenteAlerta .modal-body p').text(`El monto de ITBIS no puede ser mayor a el calculado.`);

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

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

		}

		if(Number(this.value) === 0)
			$(subtotal).trigger('focusout')
		;

	});

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

		if(Number(this.value.replaceAll(',','')) > Number((subtotal.value).replaceAll(',','')))
		{
			// +
			$('#ventanaEmergenteAlerta .modal-header')
				.removeClass('bg-success')
				.addClass('bg-danger')
			;

			$('#ventanaEmergenteAlerta .modal-body p').text(`EL MONTO DE SERVICIO NO PUEDE SER MAYOR A EL SUBTOTAL.`);

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

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

		}

		if(Number(this.value) === 0)
			$(subtotal).trigger('focusout')
		;

	});

	// !
	$('.campo-sumar').focusout(function (evento) {

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

		let suma = 0;

		$('.campo-sumar').each(function() {
			let valor = Number($(this).val().replaceAll(',', '')) || 0;
			suma += valor;
		});

		actualizarCredito(suma)
		campo.monto.unmaskedValue = suma.toString();

		total_pagar = suma;

	});

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

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

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

		// +
		if(Number(valor.diferencia.replaceAll(',','')) > 0) {

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

			$('#ventanaEmergenteAlerta .modal-body p').text(
				`LA CODIFICACIÓN DEBE DE ESTAR CUADRADA`
			);

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

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

			return false

		}

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

				valor.id_cuenta_contable = Number(valor.id_cuenta_contable);
				valor.debito = Number(valor.debito);
				valor.credito = Number(valor.credito);

				return valor
			}))
		);

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

	});

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

		if(!id_factura.value)
		{

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

			$('#ventanaEmergenteAlerta .modal-body p').text(
				`Debe de seleccionar una factura antes de imprimir.`
			);

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

			return
		}

		imprimir(id_factura.value)

	});

	// !
	$(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: {
				validar: $('[name="id_cuenta_contable"], [name="debito"], [name="credito"]')
			}
		},
		ventana = {
			emergente: { mensaje: ''}
		}

		tabla.codificacion.fila.datos = {
			id_cuenta_contable: id_cuenta_contable.value,
			cuenta_contable: id_cuenta_contable.selectedOptions[0].textContent.trim(),
			debito: campo.debito.typedValue,
			credito: campo.credito.typedValue
		}

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

		// +
		if (!tabla.codificacion.fila.datos.id_cuenta_contable) {

			ventana.emergente.mensaje = '¡TIENES QUE SELECCIONAR UNA CUENTA CONTABLE!';

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

		} else if (!tabla.codificacion.fila.datos.debito && !tabla.codificacion.fila.datos.credito) {

			ventana.emergente.mensaje = '¡TIENES QUE INGRESAR UN DÉBITO O CRÉDITO!';

			window.aplicacion.peticion.formulario.campo.invalido = $('#debito, #credito')

		} else if (tabla.codificacion.fila.datos.debito && tabla.codificacion.fila.datos.credito) {

			ventana.emergente.mensaje = '¡NO PUEDES INGRESAR UN DÉBITO Y CRÉDITO A LA VEZ!';

			window.aplicacion.peticion.formulario.campo.invalido = $('#debito, #credito')

		}

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

		}

		// +
		tabla.codificacion.elemento
			.find(`tbody .id_cuenta_contable:contains(${tabla.codificacion.fila.datos.id_cuenta_contable})`)
			.each((indice, elemento) => {

				if (elemento.textContent === tabla.codificacion.fila.datos.id_cuenta_contable) {

				tabla.codificacion.fila.modificar = elemento.parentElement;

				return false

			}

		});

		// +
		if (tabla.codificacion.fila.modificar) {

			tabla.codificacion.instancia
				.row(tabla.codificacion.fila.modificar)
				.data(tabla.codificacion.fila.datos)
			;

		} else
			tabla.codificacion.instancia.row.add(tabla.codificacion.fila.datos)
		;

		// +
		tabla.codificacion.instancia.draw(false);

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

		// +
		tabla.codificacion.fila.modificar = false

	});

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

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

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

			// +
			let datos = tabla.codificacion.instancia.row(this).data();;

			// +
			$(id_cuenta_contable).val(datos.id_cuenta_contable).change();
			campo.debito.value = datos.debito.toString().replaceAll(',','');
			campo.credito.value = datos.credito.toString().replaceAll(',','');

		}
		else {

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

			// +
			if(this.children[1].textContent === cuenta_contable.value) {

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

				// ?
				$(ventanaEmergenteAlerta)
					.find('.modal-body p')
					.text('¡NO PUEDES ELIMINAR ESTÁ CUENTA CONTABLE!')
				;

				// ?
				return $(ventanaEmergenteAlerta).modal('show')

			}

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

		}

  });

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

		if (!this.classList.contains('dataTable'))
			return
		;

		// +
		function obtenerColumna(indiceColumna) {
			let pie = $('#tablaRegistrosCodificacion').DataTable().column(indiceColumna, { page: 'current' });
			return {
				valor: $(pie.footer()).text().replaceAll(',', ''),
				actualizar: (valor) => {
					$(pie.footer()).html(valor)
				}
			};
		}

		// ?
		valor.debito = Number(obtenerColumna(2).valor);
		valor.credito = Number(obtenerColumna(3).valor);
		valor.diferencia = formatoNumerico(Math.abs(valor.credito - valor.debito),2);

		// ?
		$(obtenerColumna(1).actualizar(`Diferencia ${valor.diferencia}`));

	});

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

    if (
      $(this).has('.dataTables_empty').length ||
      $(this).is('.dtrg-group')
    )
      return
    ;

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

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

  });

	// !
	const desactivarCampos = (condicion,limpiar = false) => {

		const campos = [
			porciento_isr,
			monto_isr,
			itbis_servicio,
			propina_legal,
			itbis,
			impuesto_selectivo,
			porciento_retencion,
			monto_retencion,
			otros_impuestos
		];

		for (var i = 0; i < campos.length; i++) {
			campos[i].disabled = condicion
		}

		if(limpiar === true)
		{
			$(campos).trigger('reset');
		}

	}

	// !
	function actualizarCredito(valor) {

		if (!valor)
			return
		;

		// +
		let cuenta = {
			id_cuenta_contable: id_cuenta_contable_cuenta.value,
			cuenta_contable: cuenta_contable.value,
			debito: 0,
			credito: valor
		}

		const celdas = document.querySelectorAll('#tablaRegistrosCodificacion tbody .id_cuenta_contable')

		const fila = [...celdas].find(celda => {
			return Number(celda.textContent) === Number(id_cuenta_contable_cuenta.value);
		});

		if(fila){
			$('#tablaRegistrosCodificacion').DataTable().row(fila).data(cuenta).draw(false);
		}
		else{
			$('#tablaRegistrosCodificacion').DataTable().row.add(cuenta).draw(false);
		}

	}

	function actualizarRetencion(evento) {

		const montoSubtotal = campo.subtotal.unmaskedValue;
		const montoItbis = campo.itbis.unmaskedValue;

		const porcentajeISR = evento.delegateTarget.id === 'porciento_isr'
			? Number($('#porciento_isr').val()) * (montoSubtotal / 100)
			: campo.monto_isr.unmaskedValue;
		;

		const porcentajeRetencion = evento.delegateTarget.id === 'porciento_retencion'
			? Number($('#porciento_retencion').val()) * (montoItbis / 100)
			: campo.monto_retencion.unmaskedValue;
		;

		const montoPagar = total_pagar - porcentajeISR - porcentajeRetencion;

		campo.monto.value = montoPagar.toString();

		actualizarCredito(montoPagar);

		const campo_retencion = evento.delegateTarget.id === 'porciento_isr' ? 'monto_isr' : 'monto_retencion';

		campo[campo_retencion].unmaskedValue = campo_retencion === 'monto_isr'
		? porcentajeISR.toString()
		: porcentajeRetencion.toString();
	}

	// !
	$(document).on('form reset',function(evento){
		total_pagar,suma = 0;
	});

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

		if (
				window.aplicacion.peticion.formulario.elemento === formularioEntradasFacturasCXP &&
				window.aplicacion.peticion.formulario.exitosa.propiedades === window.aplicacion.peticion.exitosa.propiedades
			) {
				const id = Number(window.aplicacion.peticion.formulario.exitosa.propiedades.responseJSON[0].id_registro)
				imprimir(id)
			}

	})

	// !
	function imprimir(id) {

		const impresion = {
			programa: 'procesos.entradaCxp',
			renglon: 'FACTURA_CXP',
			id: id,
			generico: 1
		}

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

			}
		});

	}

})()
