// {} Librerías e importaciones

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

// {}
(async () => {

  // ! Declaración de variables
  let
    peticion = {
      actual: null
    },
    campo = {
			monto: window.aplicacion.campo.mascara.monto,
			tasa: window.aplicacion.campo.mascara.tasa,
			credito: window.aplicacion.campo.mascara.credito,
			debito: window.aplicacion.campo.mascara.debito,
			id_cliente: window.aplicacion.campo.mascara.id_cliente,
			ncf: IMask(ncf,{ mask: /^[a-zA-Z][0-9]*$/ })
    },
		tabla = {
			facturas: {
				elemento: $(tablaRegistros),
				clase: new Tabla({
					datos: {
						peticion: {
							ruta: `${window.aplicacion.enlace}/ejecutar`,
							parametro: {
								procedimiento: 'p_traer_facturas_entidad',
								renglon: 'CLIENTE',
								id_entidad: () => !id_entidad.value ? -1 : id_entidad.value,
								situacion: ''
							}
						}
					},
					configuracion: {
						dom: `ft`,
						pageLength: -1,
						autoWidth:true
					}
				})
			},
			codificacion: {
				elemento: $(tablaRegistrosCodificacion),
				clase: new Tabla({
					tabla: tablaRegistrosCodificacion,
					datos: {
						peticion: {
							ruta: `${window.aplicacion.enlace}/ejecutar`,
							parametro: {
								procedimiento: 'p_traer_codificacion',
								renglon: 'CXC',
								id_documento: () => !id_factura.value ? -1 : id_factura.value
							}
						}
					},
					configuracion: {
						dom: `t`,
						pageLength: -1
					}
				})
			}
		},
		fila = null,
		valor = {
			credito: 0,
			debito: 0,
			diferencia: 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();


	$.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) {

		// +
		const camposLimpiar = $([id_cliente, cliente, id_entidad, id_cuenta_contable_cuenta, cuenta_contable, condicion])

    // +
    if (!this.value)
      return camposLimpiar.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',
        id_renglon: this.value
      },
      beforeSend: function(peticion, configuracion) {
				camposLimpiar.trigger('reset')
				$(numero_factura).trigger('reset').trigger('focusout');
			},
      success: function(respuesta, estado, peticion) {

				if (!respuesta.length) return;

				campo.id_cliente.value = respuesta[0].id_cliente;
				cliente.value = respuesta[0].cliente;
				id_entidad.value = respuesta[0].id_entidad;
				id_cuenta_contable_cuenta.value = respuesta[0].id_cuenta_contable_cuenta;
				cuenta_contable.value = respuesta[0].cuenta_contable;

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

			$('#tablaRegistros').DataTable().ajax.reload().columns.adjust().draw();

      },
      campo: { elemento: this }
    })

  });

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

		const camposLimpiar = () => {
			fecha.value = fecha.max;
			$([id_factura, monto, id_renglon, ncf, concepto, tablaRegistrosCodificacion]).trigger('reset')
			monto.disabled = false
		};

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

		// + 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`,
      type: 'GET',
      data: {
        procedimiento: 'p_traer_factura_entidad',
        renglon: 'CLIENTE',
				id_entidad: id_entidad.value,
				numero_factura: numero_factura.value
      },
      beforeSend: function(peticion, configuracion) { camposLimpiar() },
      success: function(respuesta, estado, peticion) { },
      error: function(peticion, estado) {},
      complete: function(peticion, estado) { $(tablaRegistrosCodificacion).DataTable().ajax.reload() },
			formulario: { elemento: formularioEntradaCXC }
    });

  });

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

		// +
		let cuenta = {
			id_cuenta_contable: id_cuenta_contable_cuenta.value,
			cuenta_contable: cuenta_contable.value,
			debito: Number(monto.value.replaceAll(',','')),
			credito: 0
		}

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

		// +
		fila = $(`#tablaRegistrosCodificacion tbody .id_cuenta_contable:contains(${id_cuenta_contable_cuenta.value})`);

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

			$('#tablaRegistrosCodificacion').DataTable().row(fila).data(cuenta).draw(false);

			return false
		}

		$(tablaRegistrosCodificacion).DataTable().row.add(cuenta).draw(false);


	});

	// !
	$(botonGuardar).on('click',function(evento) {

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

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

	});

	// !
	$(botonAgregar).on('click',function(evento) {

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

		// +
		let datos_tabla = {
			id_cuenta_contable: Number(id_cuenta_contable.value),
			cuenta_contable: $('#id_cuenta_contable option:selected').text().trim(),
			debito: Number(debito.value.replaceAll(',','')) ?? 0,
			credito: Number(credito.value.replaceAll(',','')) ?? 0
		},
		campos = {
			validar: $('[name="id_cuenta_contable"], [name="debito"], [name="credito"]')
		}

		// +
		$(this).find('.is-invalid').removeClass('is-invalid');

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

		// +
		if(datos_tabla.credito > 0 && datos_tabla.debito > 0) {

			$('#ventanaEmergenteAlerta .modal-body p').text(
				`No es posible poner crédito y débito a la vez.`
			);

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

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

			return false

		}

		// +
		if(!id_cuenta_contable.value){
			$('#ventanaEmergenteAlerta .modal-body p').text(
				`No puede dejar la cuenta contable en blanco.`
			);

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

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

			return false

		}

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

		// Esto para comprobar si existe el elemento, no se puede usar
		// :contains por que matchea cualquier parte, no si es exacta
		const fila = [...celdas].find(celda => {

			return Number(celda.textContent) === (Number(id_cuenta_contable.value))
		});

		// +
		if (fila) {

			$('#tablaRegistrosCodificacion').DataTable().row(fila).data(datos_tabla).draw(false);

			campos.validar.trigger('reset')

			return false
		}

		// +
		if ($(this).find('.is-invalid').length)
			return
		;

		 $(tablaRegistrosCodificacion).DataTable().row.add(datos_tabla).draw(false);

		 campos.validar.trigger('reset')

	});

	// !
	$(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)

	});

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

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

			// +
			let datos = $('#tablaRegistrosCodificacion').DataTable().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!');

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

				return false
			}

			// +
			$(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) {

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

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

  });

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

    if (
			window.aplicacion.peticion.formulario.elemento === formularioEntradaCXC &&
			window.aplicacion.peticion.formulario.exitosa.propiedades === window.aplicacion.peticion.exitosa.propiedades
    )
			{

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

				const id = Number(window.aplicacion.peticion.formulario.exitosa.propiedades.responseJSON[0].id_registro)

				imprimir(id)

			}
		;

  })

	// !
	function imprimir(id) {

		const impresion = {
			programa: 'procesos.entradaCxc',
			renglon: 'FACTURA_CXC',
			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();

			}
		});

	}

})()
