class CustomDataTable {
  tabla = null;

  constructor({
    id,
    alineadoIzquierda = [],
    noOrdenable = [],
    responsive = true,
    searching = true,
    adicional = {},
    filaSeleccionable = true,
  }) {
    this.id = id;
    this.alineadoIzquierda = alineadoIzquierda;
    this.noOrdenable = noOrdenable;
    this.responsive = responsive;
    this.searching = searching;
    this.adicional = adicional;
    this.filaSeleccionable = filaSeleccionable;

    this.#inicializar();
  }

  #inicializar() {
    this.tabla = $(`#${this.id}`).DataTable({
      responsive: this.responsive,
      searching: this.searching,
      columnDefs: [
        {
          targets: this.alineadoIzquierda,
          className: "text-start",
        },
        {
          orderable: false,
          targets: this.noOrdenable,
        },
      ],
      ...this.adicional,
    });

    if (this.filaSeleccionable) {
      $(`#${this.id} tbody`).on("click dblclick", "td", function () {
        const indiceUltimaColumna = $(this).siblings().length;

        if (
          $(this).closest("tr").attr("id") &&
          $(this).index() !== indiceUltimaColumna
        ) {
          $(this)
            .closest("table")
            .find("tr")
            .not($(this).closest("tr"))
            .removeClass("selected");

          $(this).closest("tr").toggleClass("selected");
        }
      });
    }
  }

  agregarFila({ datos, idFila }) {
    this.tabla.row.add(datos).node().id = idFila;
    return this;
  }

  actualizarFila({ datos, idFila }) {
    let fila = this.tabla.row(`#${idFila}`),
      indice = fila.index();

    for (let key in datos) {
      this.tabla.cell(indice, key).data(datos[key]);
      $(`#${idFila}`).find(`td:eq(${key})`).html(datos[key]);
    }

    return this;
  }

  eliminarFila({ idFila }) {
    this.tabla.row(`#${idFila}`).remove().draw();
    return this;
  }

  limpiar() {
    this.tabla.clear().draw();
    return this;
  }

  redibujar() {
    this.tabla.columns.adjust().draw().responsive.recalc();
  }

  destruir() {
    this.tabla.destroy();
  }
}

export default CustomDataTable;
