// {} Librerías e importaciones

// ! Utilidades
import { pluralizarFrase, capitalizarLetra } from '../../../utilidades.js';

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

// {}
(async () => {

  // ! Declaración de variables
  let
    ventana = {
      actualizar: {
        titulo: (titulo) => {

          document.title += ` ${titulo}`;
          document.querySelectorAll('header h1').forEach(elemento => elemento.textContent = titulo)

        }
      },
      emergente: { inicializador: $('[data-accion="crear"]') }
    },
    accion = {
      peticion: {
        campo: () => ventana.emergente.inicializador.data('peticionCampo'),
        tabla: () =>
          ventana.emergente.inicializador.data('peticionTabla') ??
          pluralizarFrase(ventana.emergente.inicializador.data('peticionCampo')?.replace('id_', ''))
      }
    },
    tabla = {
      datos: {
        peticion: { ruta: `${window.aplicacion.enlace}/ejecutar` }
      },
      configuracion: { dom: `ftp` }
    }

  ventana.actualizar.titulo(`Registro de ${capitalizarLetra(accion.peticion.tabla().replaceAll('_', ' '))}`);

  if (window.aplicacion.programa.generico)
    await $.ajax({
      url: `${window.aplicacion.enlace}/esquema`,
      data: { tabla: accion.peticion.tabla() },
      beforeSend: function(peticion, configuracion) {},
      success: function(respuesta, estado, peticion) {

        respuesta.forEach((registro, iteracion) => {

          if (['id_usuario', 'fecha_registro', 'fecha_actualizado', 'id_estado'].includes(registro.nombre))
            return
          ;

          if (!registro.id) {

            registro.id = registro.nombre;

            registro.titulo = capitalizarLetra(registro.id.replace('id_', '').replaceAll('_', ' '));

            if (registro.id === accion.peticion.campo()) {

              registro.titulo = `ID ${registro.titulo}`;

              registro.columna_primaria = 'id'

            } else if (registro.id.startsWith('id_'))
              registro.foranea = true
            ;

            registro.foranea = registro.id !== accion.peticion.campo() && registro.id.startsWith('id_');

          }

					if (registro.foranea)
						registro.id = registro.id.replace('id_', '')
					;

          registro.elemento = $(`<th>${registro.titulo}</th>`);

          if (registro.columna_primaria)
            registro.elemento.addClass('id')
          ;

          registro.elemento = registro.elemento[0];

          registro.elemento.dataset.columnaNombre = registro.id;
          registro.elemento.dataset.columnaTipo = registro.tipo;
          registro.elemento.dataset.columnaOrdenable = '';
          registro.elemento.dataset.columnaBuscable = '';

          if (!iteracion)
            registro.elemento.dataset.columnaSumar = 'filas'
          ;

          $('#tablaRegistros thead tr').append(registro.elemento);

        });

        $('#tablaRegistros thead tr').append('<th class="text-center" data-columna-tipo="modificar" data-columna-ancho="1%"></th>');


				tabla.datos.peticion.parametro = respuesta.some((columna) => columna.foranea)
					? {
            procedimiento: 'p_traer_registros_combinados',
            renglon: accion.peticion.tabla()
          }
					: {
						procedimiento: 'p_traer_registros_consulta_principal',
						origen_registros: accion.peticion.tabla(),
						campo_ordenar: accion.peticion.campo()
					}

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

    tabla.columna = {
      peticion: {
        ruta: `${window.aplicacion.enlace}/ejecutar`,
        parametro: { procedimiento: 'p_traer_encabezado_registros' }
      }
    }

    tabla.datos.peticion.parametro = {
      procedimiento: `p_traer_${accion.peticion.tabla()}`,
      renglon: accion.peticion.tabla()
    }

    ventana.emergente.inicializador[0].dataset.peticionDatosProcedimiento = ''

  }

  if (ventana.emergente.inicializador[0].hasAttribute('data-peticion-datos-procedimiento'))
    await $.ajax({
      url: `${window.aplicacion.enlace}/ejecutar`,
      data: {
        funcion: 'f_objeto_existe',
        nombre_objeto: `p_traer_${accion.peticion.tabla()}`,
        tipo_objeto: 'P'
      },
      beforeSend: function(peticion, configuracion) {},
      success: function(respuesta, estado, peticion) {

				tabla.datos.peticion.parametro = respuesta[0][""]
					? {
					procedimiento: 'p_traer_registros_combinados',
					renglon: accion.peticion.tabla()
					}
					: {
            procedimiento: `p_traer_${accion.peticion.tabla()}`,
            renglon: accion.peticion.tabla()
          }

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

  new Tabla(tabla).inicializar();

  $(tablaRegistros).on('dblclick', 'tr', function(evento) { $(this).find('.modificar').click() });

  $(tablaRegistros).on('click', 'tr .modificar', function(evento) {

    $(this).closest('table').find('tbody tr.table-active').removeClass('table-active');

		ventana.emergente.inicializador.trigger('click', {
			peticion: {
				id: $(this).closest('tr').addClass('table-active').find('.id').text()
			}
		})

  });

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

  //   // +
  //   if (
  //     window.aplicacion.peticion.formulario.elemento === formularioVentanaEmergente &&
  //     window.aplicacion.peticion.formulario.exitosa.propiedades === window.aplicacion.peticion.exitosa.propiedades
  //   )
  //     $('#tablaRegistros').DataTable().ajax.reload({
  //       draw: false
  //     })

  // })

})()
