"use strict";

import CustomDataTable from "../../../../assets/js/app/CustomDataTable.js?v=2.0.0";
import { CODEMPRESA } from "../../../../assets/js/app/constantes.js?v=2.0.0";
import {
  abrirPDF,
  calcularEdad,
  mostrarMensajes,
  mostrarToastify,
  obtenerHTMLBotonesDropdown,
  obtenerNombreModulo,
} from "../../../../assets/js/app/funcionesGenerales.js?v=2.0.0";
import metodosFormularios from "../../../../assets/js/app/metodosFormularios.js?v=2.0.0";
import UbicacionEmpresa from "../../../../assets/js/models/ubicacionEmpresaModel.js?v=2.0.0";
import Empleado from "../models/empleadoModel.js?v=2.0.0";
import TipoPlanilla from "../models/tipoPlanillaModel.js?v=2.0.0";
import Departamento from "../../../../assets/js/models/departamentoModel.js?v=2.0.0";
import Municipio from "../../../../assets/js/models/municipioModel.js?v=2.0.0";

!(function () {
  document
    .getElementById("buscarEmpleado-form")
    .addEventListener("submit", (e) => {
      e.preventDefault();
      configEmpleado.buscar();
    });

  document
    .getElementById("btn-agregar-empleado")
    .addEventListener("click", () => {
      configEmpleado.editar();
    });

  document
    .getElementById("btn-cancelar-edicion")
    .addEventListener("click", () => {
      configEmpleado.cancelar();
    });

  document
    .getElementById("cbo-tipoPlanilla")
    .addEventListener("change", function () {
      configEmpleado.evaluarTipoPlanilla();
    });

  document.getElementById("cbo-pais").addEventListener("change", () => {
    configEmpleado.evaluarPais();
  });

  document.getElementById("cbo-departamento").addEventListener("change", () => {
    configEmpleado.evaluarDepartamento();
  });

  document
    .getElementById("txt-fechaNacimiento")
    .addEventListener("change", () => {
      configEmpleado.evaluarFechaNacimiento();
    });

  document
    .getElementById("btn-eliminarFotoEmpleado")
    .addEventListener("click", () => {
      configEmpleado.eliminarFoto();
    });

  document
    .getElementById("file-adjuntoEmpleado")
    .addEventListener("change", (e) => {
      configAdjunto.mostrarPreviewModal();
    });

  document.getElementById("chk-cotizaISSS").addEventListener("change", (e) => {
    configEmpleado.evaluarCotizaISSS();
  });

  document.getElementById("chk-cotizaAFP").addEventListener("change", (e) => {
    configEmpleado.evaluarCotizaAFP();
  });

  document.getElementById("cbo-tipoPago").addEventListener("change", (e) => {
    configEmpleado.evaluarTipoPago();
  });

  document
    .getElementById("cbo-tipoDocumento")
    .addEventListener("change", () => {
      configEmpleado.evaluarTipoDocumento();
    });

  document
    .getElementById("btn-guardar-empleado")
    .addEventListener("click", (e) => {
      configEmpleado.guardar();
    });

  document.getElementById("cbo-genero").addEventListener("change", () => {
    configEmpleado.evaluarCasada();
  });

  document.getElementById("cbo-estadoCivil").addEventListener("change", () => {
    configEmpleado.evaluarCasada();
  });

  document.getElementById("adjunto-form").addEventListener("submit", (e) => {
    e.preventDefault();
    configAdjunto.guardar();
  });

  document.addEventListener("click", (e) => {
    const target = e.target;

    document
      .getElementById("file-foto-empleado")
      .addEventListener("change", function () {
        configEmpleado.cambiarFoto();
      });

    if (target.classList.contains("editar-empleado"))
      configEmpleado.editar(target.dataset.id);
  });
})();

const loader = document.querySelector(".loader");

window.onload = async () => {
  try {
    await inicializarTablas();
    await configEmpleado.inicializar();
    loader && loader.classList.add("d-none");
    configEmpleado.inicializarCatalogos();
  } catch (err) {
    console.error(err);
  }
};

function inicializarTablas() {
  return new Promise((resolve, reject) => {
    try {
      configEmpleado.tabla = new CustomDataTable({
        id: "tbl-empleados",
        alineadoIzquierda: [3],
        noOrdenable: [10],
      });

      configAdjunto.tabla = new CustomDataTable({
        id: "tbl-adjuntos",
        alineadoIzquierda: [1, 2],
        noOrdenable: [2],
        filaSeleccionable: false,
        adicional: {
          lengthChange: false,
          buttons: [
            {
              text: '<i class="fas fa-upload"></i> Seleccionar',
              title: "Seleccionar archivo",
              className: "btn-info btn-sm",
              action: function (e, dt, node, config) {
                configAdjunto.editar();
              },
            },
          ],
        },
      });

      configAdjunto.tabla.tabla
        .buttons()
        .container()
        .appendTo("#tbl-adjuntos_wrapper .col-md-6:eq(0)");

      $("#tbl-adjuntos tbody").on("click", "td", function () {
        if ($(this).closest("tr").attr("id") && $(this).index() != 3) {
          if ($(this).closest("tr").hasClass("selected")) {
            $(this).closest("tr").removeClass("selected");
            configAdjunto.limpiarPreview();
          } else {
            configAdjunto.tabla.tabla.$("tr.selected").removeClass("selected");
            $(this).closest("tr").addClass("selected");
            let id = $(this).closest("tr").attr("id").replace("trAdjunto", "");
            configAdjunto.mostrarPreview(id);
          }
        }
      });
      resolve();
    } catch (err) {
      reject(err);
    }
  });
}

const configEmpleado = {
  id: 0,
  cnt: 0,
  tabla: null,
  form: "buscarEmpleado-form",
  tabs: {
    empleados: document.getElementById("empleados-tab"),
    nuevoEmpleado: document.getElementById("editar-empleado-tab"),
  },
  botones: {
    agregarUsuario: document.getElementById("btns-nuevo-empleado"),
    guardar: document.getElementById("btns-guardar-empleado"),
  },
  campos: {
    tipoPlanilla: document.getElementById("cbo-tipoPlanilla"),
    empresa: document.getElementById("cbo-empresa"),
    sucursal: document.getElementById("cbo-sucursal"),
    proyecto: document.getElementById("cbo-proyecto"),
    estadoBusqueda: document.getElementById("cbo-estadoBusqueda"),
    foto: document.getElementById("img-foto-empleado"),
    archivoFoto: document.getElementById("file-foto-empleado"),
    codempleado: document.getElementById("txt-codigoEmpleado"),
    tipoDocumento: document.getElementById("cbo-tipoDocumento"),
    numeroDocumento: document.getElementById("txt-numeroDocumento"),
    nit: document.getElementById("txt-nit"),
    primerNombre: document.getElementById("txt-primerNombre"),
    segundoNombre: document.getElementById("txt-segundoNombre"),
    primerApellido: document.getElementById("txt-primerApellido"),
    segundoApellido: document.getElementById("txt-segundoApellido"),
    empresaEmpleado: document.getElementById("cbo-empresaEmpleado"),
    sucursalEmpleado: document.getElementById("cbo-sucursalEmpleado"),
    proyectoEmpleado: document.getElementById("cbo-proyectoEmpleado"),
    unidadTrabajo: document.getElementById("cbo-unidadTrabajo"),
    genero: document.getElementById("cbo-genero"),
    estadoCivil: document.getElementById("cbo-estadoCivil"),
    apellidoCasada: document.getElementById("txt-apellidoCasada"),
    conocidoPor: document.getElementById("txt-conocidoPor"),
    fechaNacimiento: document.getElementById("txt-fechaNacimiento"),
    edad: document.getElementById("num-edad"),
    pais: document.getElementById("cbo-pais"),
    departamento: document.getElementById("cbo-departamento"),
    municipio: document.getElementById("cbo-municipio"),
    direccion: document.getElementById("txt-direccion"),
    telefonoFijo: document.getElementById("txt-telefonoFijo"),
    telefonoCelular: document.getElementById("txt-telefonoCelular"),
    profesion: document.getElementById("cbo-profesion"),
    fechaEmisionDUI: document.getElementById("txt-fechaEmisionDUI"),
    fechaVencimientoDUI: document.getElementById("txt-fechaVencimientoDUI"),
    departamentoEmpresa: document.getElementById("cbo-departamentoEmpresa"),
    puesto: document.getElementById("cbo-puesto"),
    jefeInmediato: document.getElementById("cbo-jefeInmediato"),
    estado: document.getElementById("cbo-estado"),
    fechaIngreso: document.getElementById("txt-fechaIngreso"),
    cotizaISSS: document.getElementById("chk-cotizaISSS"),
    fechaInicioCotizacion: document.getElementById("txt-fechaInicioCotizacion"),
    numeroAfiliacion: document.getElementById("txt-numeroAfiliadoISSS"),
    cotizaAFP: document.getElementById("chk-cotizaAFP"),
    tipoAFP: document.getElementById("cbo-tipoAFP"),
    nup: document.getElementById("txt-nup"),
    salario: document.getElementById("num-salario"),
    tipoPago: document.getElementById("cbo-tipoPago"),
    banco: document.getElementById("cbo-banco"),
    numeroCuenta: document.getElementById("txt-numeroCuenta"),
    numeroTarjeta: document.getElementById("txt-numeroTarjeta"),
    poseeArma: document.getElementById("chk-armaFuego"),
    numeroLicenciaArma: document.getElementById("txt-licenciaArmas"),
    fechaEmisionLicenciaArmas: document.getElementById(
      "txt-fechaEmisionLicenciaArmas"
    ),
    fechaExpiraLicenciaArmas: document.getElementById(
      "txt-fechaExpiracionLicenciaArmas"
    ),
    enEmergenciaLlamar: document.getElementById("txt-emergenciaLicenciaArmas"),
    numeroRegistroLicenciaArmas: document.getElementById(
      "txt-registroLicenciaArmas"
    ),
    tipoSangre: document.getElementById("txt-tipoSangreLicenciaArma"),
    telefonoLicenciaArmas: document.getElementById("txt-telefonoLicenciaArma"),
  },
  ubicacion: null,
  ubicacionEmpleado: null,
  defaultPhoto: `main/RRHH/assets/images/empleados/default.png`,
  resetPhoto: false,
  nuevaFoto: {
    archivo: null,
    nombreArchivo: null,
  },
  inicializar: function () {
    return new Promise(async (resolve, reject) => {
      try {
        let { data: tiposPlanilla } = await TipoPlanilla.obtenerPorUsuario();

        tiposPlanilla = tiposPlanilla || [];

        let opciones = tiposPlanilla.map(
          (tipo) =>
            `<option value="${tipo.codtipoplanilla}">${tipo.tipoPlanilla}</option>`
        );
        opciones.length > 0 &&
          opciones.unshift(
            `<option selected disabled value="">Seleccione</option>`
          );

        this.campos.tipoPlanilla.innerHTML = opciones.join("");

        resolve();
      } catch (err) {
        reject(err);
      }
    });
  },
  inicializarCatalogos: async function () {
    try {
      let opciones = [];
      const {
        data: {
          estadosCiviles = [],
          paises = [],
          profesiones = [],
          departamentosEmpresa = [],
          puestos = [],
          institucionesPrevisionales = [],
          institucionesFinancieras = [],
          tiposDocumentos = [],
          estados = [],
          tiposDocumentosAdjuntos = [],
          unidadesTrabajo = [],
        },
      } = await Empleado.obtenerCatalogosGestion();

      opciones = estadosCiviles.map(
        (estado) =>
          `<option value="${estado.codestadocivil}">${estado.estadoCivil}</option>`
      );

      opciones.length > 0 &&
        opciones.unshift(
          `<option selected disabled value="">Seleccione</option>`
        );

      this.campos.estadoCivil.innerHTML = opciones.join("");

      $(`#${this.campos.estadoCivil.id}`)
        .selectpicker("destroy")
        .selectpicker();

      opciones = paises.map(
        (pais) =>
          `<option value="${pais.codigoPais}">${pais.nombrePais}</option>`
      );

      opciones.length > 0 &&
        opciones.unshift(
          `<option selected disabled value="">Seleccione</option>`
        );

      this.campos.pais.innerHTML = opciones.join("");

      $(`#${this.campos.pais.id}`).selectpicker("destroy").selectpicker();

      opciones = profesiones.map(
        (profesion) =>
          `<option value="${profesion.codigoProfesion}">${profesion.nombreProfesion}</option>`
      );

      opciones.length > 0 &&
        opciones.unshift(
          `<option selected disabled value="">Seleccione</option>`
        );

      this.campos.profesion.innerHTML = opciones.join("");

      $(`#${this.campos.profesion.id}`).selectpicker("destroy").selectpicker();

      opciones = departamentosEmpresa.map(
        (departamento) =>
          `<option value="${
            departamento.coddepartamento
          }">${departamento.nombreDepartamento.trim()}</option>`
      );

      opciones.length > 0 &&
        opciones.unshift(
          `<option selected disabled value="">Seleccione</option>`
        );

      this.campos.departamentoEmpresa.innerHTML = opciones.join("");

      $(`#${this.campos.departamentoEmpresa.id}`)
        .selectpicker("destroy")
        .selectpicker();

      opciones = puestos.map(
        (puesto) =>
          `<option value="${
            puesto.codpuesto
          }">${puesto.nombrePuesto.trim()}</option>`
      );

      opciones.length > 0 &&
        opciones.unshift(
          `<option selected disabled value="">Seleccione</option>`
        );

      this.campos.puesto.innerHTML = opciones.join("");

      $(`#${this.campos.puesto.id}`).selectpicker("destroy").selectpicker();

      opciones = institucionesPrevisionales.map(
        (institucion) =>
          `<option value="${
            institucion.codafp
          }">${institucion.nombreInstitucion.trim()}</option>`
      );

      opciones.length > 0 &&
        opciones.unshift(
          `<option selected disabled value="">Seleccione</option>`
        );

      this.campos.tipoAFP.innerHTML = opciones.join("");

      opciones = institucionesFinancieras.map(
        (institucion) =>
          `<option value="${
            institucion.codbanco
          }">${institucion.nombreInstitucion.trim()}</option>`
      );

      opciones.length > 0 &&
        opciones.unshift(
          `<option selected disabled value="">Seleccione</option>`
        );

      this.campos.banco.innerHTML = opciones.join("");

      $(`#${this.campos.banco.id}`).selectpicker("destroy").selectpicker();

      opciones = tiposDocumentos.map(
        (tipo) =>
          `<option value="${tipo.codigoDocumento}">${tipo.tipoDocumento}</option>`
      );

      opciones.length > 0 &&
        opciones.unshift(
          `<option selected disabled value="">Seleccione</option>`
        );

      this.campos.tipoDocumento.innerHTML = opciones.join("");

      opciones = estados.map(
        (estado) =>
          `<option value="${estado.codestado}">${estado.estado}</option>`
      );
      opciones.length > 0 &&
        opciones.unshift(
          `<option selected disabled value="">Seleccione</option>`
        );

      this.campos.estado.innerHTML = opciones.join("");

      opciones = unidadesTrabajo.map(
        (unidad) =>
          `<option value="${unidad.id}">${unidad.unidadTrabajo}</option>`
      );

      opciones.length > 0 &&
        opciones.unshift(
          `<option selected disabled value="">Seleccione</option>`
        );

      this.campos.unidadTrabajo.innerHTML = opciones.join("");

      $(`#${this.campos.unidadTrabajo.id}`)
        .selectpicker("destroy")
        .selectpicker();

      await configAdjunto.inicializar({ tipos: tiposDocumentosAdjuntos });
    } catch (err) {
      mostrarMensajes.error(err);
    }
  },
  evaluarTipoDocumento: function () {
    const tipoDocumento = this.campos.tipoDocumento.value;

    if (!tipoDocumento) return;

    switch (parseInt(tipoDocumento)) {
      case 1:
        $(`#${this.campos.numeroDocumento.id}`).mask("00000000-0");
        break;
      case 6:
        $(`#${this.campos.numeroDocumento.id}`).mask("0000-000000-000-0");
        break;
      default:
        $(`#${this.campos.numeroDocumento.id}`).unmask();
        break;
    }
  },
  evaluarTipoPlanilla: async function () {
    const codtipoplanilla = this.campos.tipoPlanilla.value;

    if (this.ubicacion !== null) this.ubicacion.destruir();

    if (!codtipoplanilla) return;

    this.ubicacion = new UbicacionEmpresa({
      campoEmpresa: this.campos.empresa.id,
      campoSucursal: this.campos.sucursal.id,
      campoProyecto: this.campos.proyecto.id,
      idSuperior: codtipoplanilla,
      codempresa: CODEMPRESA,
      autoInit: false,
      // callback: () => {
      //   this.buscar();
      // },
    });
    await this.ubicacion.inicializar();

    document.getElementById("btn-agregar-empleado").disabled = !codtipoplanilla;
  },
  evaluarPais: async function () {
    try {
      const codigoPais = this.campos.pais.value;

      let opciones = [
        `<option selected disabled value="">Seleccione un país</option>`,
      ];

      if (codigoPais) {
        const { data: departamentos } = await Departamento.obtenerPorPais({
          codigoPais,
        });

        opciones = departamentos.map(
          (departamento) =>
            `<option value="${departamento.codigoDepartamento}">${departamento.nombreDepartamento}</option>`
        );

        opciones.length > 0 &&
          opciones.unshift(
            `<option selected disabled value="">Seleccione</option>`
          );
      }

      this.campos.departamento.innerHTML = opciones.join("");
      $(`#${this.campos.departamento.id}`)
        .selectpicker("destroy")
        .selectpicker();
      this.evaluarDepartamento();
    } catch (err) {
      throw err;
    }
  },
  evaluarDepartamento: async function () {
    const codigoDepartamento = this.campos.departamento.value;
    let opciones = [
      `<option value="" selected disabled>Seleccione un departamento</option>`,
    ];

    try {
      if (codigoDepartamento) {
        const { data: municipios } = await Municipio.obtenerPorDepartamento({
          codigoDepartamento,
        });

        opciones = municipios.map(
          (municipio) =>
            `<option value="${municipio.codigoMunicipio}">${municipio.nombreMunicipio}</option>`
        );

        opciones.length > 0 &&
          opciones.unshift(
            `<option selected disabled value="">Seleccione</option>`
          );
      }

      this.campos.municipio.innerHTML = opciones.join("");

      $(`#${this.campos.municipio.id}`).selectpicker("destroy").selectpicker();
    } catch (err) {
      throw err;
    }
  },
  evaluarFechaNacimiento: function () {
    let edad = "";
    const fechaNacimiento = this.campos.fechaNacimiento.value;

    if (fechaNacimiento) {
      edad = calcularEdad({ fechaNacimiento });
    }

    this.campos.edad.value = edad;
  },
  evaluarCotizaISSS: function () {
    const cotizaISSS = this.campos.cotizaISSS.checked;

    this.campos.fechaInicioCotizacion.disabled = !cotizaISSS;
    this.campos.numeroAfiliacion.disabled = !cotizaISSS;
  },
  evaluarCotizaAFP: function () {
    const cotizaAFP = this.campos.cotizaAFP.checked;

    this.campos.tipoAFP.disabled = !cotizaAFP;
    this.campos.nup.disabled = !cotizaAFP;
  },
  evaluarTipoPago: function () {
    const tipoPago = this.campos.tipoPago.value;

    this.campos.banco.disabled = tipoPago == 0;
    this.campos.numeroCuenta.disabled = tipoPago == 0;
    this.campos.numeroTarjeta.disabled = tipoPago == 0;

    $(`#${this.campos.banco.id}`).selectpicker("destroy").selectpicker();
  },
  evaluarCasada: function () {
    const genero = this.campos.genero.value,
      estadoCivil = this.campos.estadoCivil.value;

    this.campos.apellidoCasada.disabled = !(
      genero == "F" && [2, 3, 5].includes(parseInt(estadoCivil))
    );
  },
  buscar: async function () {
    try {
      const { codsucursal, codproyecto } = this.ubicacion.obtenerUbicacion(),
        codtipoplanilla = this.campos.tipoPlanilla.value;

      if (!codtipoplanilla || !codsucursal || !codproyecto) return;

      loader && loader.classList.remove("d-none");
      const { data: empleados } =
        await Empleado.obtenerPorTipoPlanillaUbicacion({
          codempresa: CODEMPRESA,
          codtipoplanilla,
          codsucursal,
          codproyecto,
          estado: this.campos.estadoBusqueda.value,
        });

      await this.limpiar();

      let opciones = empleados.map(
        (empleado) =>
          `<option value="${empleado.codempleado}">${empleado.codempleado} - ${empleado.primerNombre} ${empleado.segundoNombre} ${empleado.primerApellido} ${empleado.segundoApellido}</option>`
      );

      empleados.forEach((empleado) => {
        this.cnt++;
        this.data[this.cnt] = empleado;

        const fila = this.prepararParaFila({ datos: empleado, id: this.cnt });

        this.tabla.agregarFila({
          datos: fila,
          idFila: `trEmpleado${this.cnt}`,
        });
      });

      this.tabla.redibujar();

      loader && loader.classList.add("d-none");

      opciones.length > 0 &&
        opciones.unshift(
          `<option selected disabled value="">Seleccione</option>`
        );

      this.campos.jefeInmediato.innerHTML = opciones.join("");

      if (empleados.length == 0) {
        mostrarToastify({
          type: "info",
          message: "No se encontraron empleados",
        });
      }
    } catch (err) {
      mostrarMensajes.error(err);
    }
  },
  editar: async function (id = 0) {
    try {
      await metodosFormularios.limpiar({ id: "empleado-form" });
      await metodosFormularios.limpiar({ id: "datosPersonales-form" });
      await metodosFormularios.limpiar({ id: "datosGenerales-form" });

      document.getElementById("datosPersonales-tab").click();

      this.campos.foto.src = this.defaultPhoto;

      this.id = id;
      this.resetPhoto = false;
      this.nuevaFoto.archivo = null;
      this.nuevaFoto.nombreArchivo = null;
      this.campos.tipoPlanilla.disabled = true;
      this.ubicacion.bloquear();

      let adjuntos = [];

      if (this.ubicacionEmpleado !== null)
        await this.ubicacionEmpleado.destruir();

      this.ubicacionEmpleado = new UbicacionEmpresa({
        campoEmpresa: this.campos.empresaEmpleado.id,
        campoSucursal: this.campos.sucursalEmpleado.id,
        campoProyecto: this.campos.proyectoEmpleado.id,
        idSuperior: this.campos.tipoPlanilla.value,
        codempresa: CODEMPRESA,
        autoInit: false,
        agregarOpcionTodos: false,
      });

      await this.ubicacionEmpleado.inicializar();

      if (this.campos.sucursal.value > 0) {
        await this.ubicacionEmpleado.asignarSucursal({
          codsucursal: this.campos.sucursal.value,
        });
      }

      if (this.campos.proyecto.value > 0) {
        await this.ubicacionEmpleado.asignarProyecto({
          codproyecto: this.campos.proyecto.value,
        });
      }

      await this.evaluarPais();
      await this.evaluarDepartamento();

      if (this.id > 0) {
        const camposSelectpicker = [
          "estadoCivil",
          "pais",
          "departamento",
          "municipio",
          "profesion",
          "departamentoEmpresa",
          "puesto",
          "jefeInmediato",
          "banco",
          "unidadTrabajo",
        ];
        const empleado = this.data[this.id];
        this.campos.foto.src = `main/RRHH/assets/images/empleados/${
          empleado.nombreArchivoFoto
        }?v=${new Date().getTime()}`;

        const {
          data: { licenciaPortacionArmas, adjuntos: adjuntosDB = [] },
        } = await Empleado.obtenerComplementoGestion({
          codempleado: empleado.codempleado,
        });

        this.campos.codempleado.value = empleado.codempleado;
        this.campos.tipoDocumento.value = empleado.idTipoDocumento;
        this.campos.numeroDocumento.value = empleado.numeroDocumento;
        this.campos.nit.value = empleado.nit;
        this.campos.unidadTrabajo.value = empleado.idUnidadTrabajo;
        this.campos.primerNombre.value = empleado.primerNombre;
        this.campos.segundoNombre.value = empleado.segundoNombre;
        this.campos.primerApellido.value = empleado.primerApellido;
        this.campos.segundoApellido.value = empleado.segundoApellido;
        await this.ubicacionEmpleado.asignarSucursal({
          codsucursal: empleado.codsucursal,
        });
        this.ubicacionEmpleado.asignarProyecto({
          codproyecto: empleado.codproyecto,
        });
        this.campos.genero.value = empleado.genero;
        this.campos.estadoCivil.value = empleado.idEstadoCivil;
        this.campos.apellidoCasada.value = empleado.apellidoCasada;
        this.campos.conocidoPor.value = empleado.conocidoPor;
        this.campos.fechaNacimiento._flatpickr.setDate(
          moment(empleado.fechaNacimiento, "YYYY-MM-DD").toDate()
        );
        this.evaluarFechaNacimiento();
        this.campos.pais.value = empleado.idPais;
        await this.evaluarPais();
        this.campos.departamento.value = empleado.idDepartamento;
        await this.evaluarDepartamento();
        this.campos.municipio.value = empleado.idMunicipio;
        this.campos.direccion.value = empleado.direccion;
        this.campos.telefonoFijo.value = empleado.telefonoFijo;
        this.campos.telefonoCelular.value = empleado.telefonoMovil;
        this.campos.profesion.value = empleado.codprofesion;
        this.campos.fechaEmisionDUI._flatpickr.setDate(
          moment(empleado.fechaEmisionDUI, "YYYY-MM-DD").toDate()
        );

        if (!!empleado.fechaVencimientoDUI) {
          this.campos.fechaVencimientoDUI._flatpickr.setDate(
            moment(empleado.fechaVencimientoDUI, "YYYY-MM-DD").toDate()
          );
        }
        this.campos.departamentoEmpresa.value = empleado.coddepartamento;
        this.campos.puesto.value = empleado.codpuesto;
        this.campos.jefeInmediato.value = empleado.codjefe;
        this.campos.estado.value = empleado.codestado;
        this.campos.fechaIngreso._flatpickr.setDate(
          moment(empleado.fechaIngreso, "YYYY-MM-DD").toDate()
        );
        this.campos.cotizaISSS.checked = parseInt(empleado.cotizaisss) === 1;

        if (parseInt(empleado.cotizaisss) === 1) {
          this.campos.fechaInicioCotizacion._flatpickr.setDate(
            moment(empleado.fechaInicioCotizacion, "YYYY-MM-DD").toDate()
          );
          this.campos.numeroAfiliacion.value = empleado.isssempleado;
        }
        this.campos.cotizaAFP.checked = parseInt(empleado.codafp) > 0;

        if (parseInt(empleado.codafp) > 0) {
          this.campos.tipoAFP.value = empleado.codafp;
          this.campos.nup.value = empleado.nupempleado;
        }

        this.campos.salario.value = parseFloat(empleado.salario).toFixed(2);
        this.campos.tipoPago.value = empleado.pagoPorTransaccion;
        this.campos.banco.value = empleado.codbanco;
        this.campos.numeroCuenta.value = empleado.numeroCuenta;
        this.campos.numeroTarjeta.value = empleado.numeroTarjeta;

        camposSelectpicker.forEach((campo) => {
          $(`#${this.campos[campo].id}`).selectpicker("destroy").selectpicker();
        });

        if (licenciaPortacionArmas) {
          this.campos.poseeArma.checked = true;
          this.campos.numeroLicenciaArma.value =
            licenciaPortacionArmas.numeroLicencia;
          this.campos.fechaEmisionLicenciaArmas._flatpickr.setDate(
            moment(licenciaPortacionArmas.fechaEmision, "DD-MM-YYYY").toDate()
          );
          this.campos.fechaExpiraLicenciaArmas._flatpickr.setDate(
            moment(licenciaPortacionArmas.fechaExpira, "DD-MM-YYYY").toDate()
          );
          this.campos.enEmergenciaLlamar.value =
            licenciaPortacionArmas.enEmergenciaLlamar;
          this.campos.numeroRegistroLicenciaArmas.value =
            licenciaPortacionArmas.numeroRegistro;
          this.campos.tipoSangre.value = licenciaPortacionArmas.tipoSangre;
          this.campos.telefonoLicenciaArmas.value =
            licenciaPortacionArmas.telefono;
        }

        adjuntos = adjuntosDB;
      }
      
      this.evaluarTipoDocumento();
      this.evaluarCotizaISSS();
      this.evaluarCotizaAFP();
      this.evaluarTipoPago();
      this.evaluarCasada();

      configAdjunto.configurar({ adjuntos });

      Object.values(this.tabs).forEach((tab) =>
        tab.classList.toggle("disabled")
      );
      this.tabs.nuevoEmpleado.click();
      Object.values(this.botones).forEach((btn) =>
        btn.classList.toggle("d-none")
      );
    } catch (err) {
      mostrarMensajes.error(err);
    }
  },
  guardar: async function () {
    try {
      document.getElementById("empleado-form").classList.add("was-validated");
      if (!metodosFormularios.validar({ id: "empleado-form" })) return;

      document
        .getElementById("datosPersonales-form")
        .classList.add("was-validated");
      if (!metodosFormularios.validar({ id: "datosPersonales-form" })) {
        document.getElementById("datosPersonales-tab").click();
        return;
      }

      document
        .getElementById("datosGenerales-form")
        .classList.add("was-validated");
      if (!metodosFormularios.validar({ id: "datosGenerales-form" })) {
        document.getElementById("datosGenerales-tab").click();
        return;
      }

      let datosLicenciaArma = {};
      if (this.campos.poseeArma.checked) {
        document
          .getElementById("portacionArmas-form")
          .classList.add("was-validated");
        if (!metodosFormularios.validar({ id: "portacionArmas-form" })) {
          document.getElementById("datosComplementarios-tab").click();
          return;
        }

        let fechaExpira = moment(
          this.campos.fechaExpiraLicenciaArmas._flatpickr.selectedDates[0]
        ).format("DD-MM-YYYY");

        datosLicenciaArma = {
          numeroLicencia: this.campos.numeroLicenciaArma.value,
          fechaEmision: this.campos.fechaEmisionLicenciaArmas.value,
          fechaExpiracion: fechaExpira,
          enEmergenciaLlamar: this.campos.enEmergenciaLlamar.value,
          numeroRegistro: this.campos.numeroRegistroLicenciaArmas.value,
          tipoSangre: this.campos.tipoSangre.value,
          telefono: this.campos.telefonoLicenciaArmas.value,
        };
      }

      let adjuntos = configAdjunto.obtenerDatos();

      const {
        codsucursal: sucursalEmpleado,
        codproyecto: proyectoEmpleado,
        labels: { sucursal, proyecto },
      } = this.ubicacionEmpleado.obtenerUbicacion();

      const empleado = new Empleado({
        adjuntos,
        apellidoCasada: this.campos.apellidoCasada.value,
        archivoFoto: this.nuevaFoto.archivo,
        codafp: this.campos.tipoAFP.value,
        codbanco: this.campos.banco.value,
        coddepartamento: this.campos.departamentoEmpresa.value,
        codempleado: this.campos.codempleado.value || 0,
        codempresa: CODEMPRESA,
        codestado: this.campos.estado.value,
        codjefe: this.campos.jefeInmediato.value,
        codprofesion: this.campos.profesion.value,
        codproyecto: proyectoEmpleado,
        codpuesto: this.campos.puesto.value,
        codsucursal: sucursalEmpleado,
        codtipoplanilla: this.campos.tipoPlanilla.value,
        conocidoPor: this.campos.conocidoPor.value,
        cotizaAFP: Number(this.campos.cotizaAFP.checked),
        cotizaisss: Number(this.campos.cotizaISSS.checked),
        datosLicenciaArma,
        departamento:
          this.campos.departamento.options[
            this.campos.departamento.selectedIndex
          ].text,
        direccion: this.campos.direccion.value,
        edad: this.campos.edad.value,
        estadoCivil: this.campos.estadoCivil.value,
        fechaEmisionDUI: this.campos.fechaEmisionDUI.value,
        fechaIngreso: this.campos.fechaIngreso.value,
        fechaInicioCotizacion: this.campos.fechaInicioCotizacion.value,
        fechaNacimiento: this.campos.fechaNacimiento.value,
        fechaVencimientoDUI: this.campos.fechaVencimientoDUI.value,
        genero: this.campos.genero.value,
        idPais: this.campos.pais.value,
        pais: this.campos.pais.options[this.campos.pais.selectedIndex].text,
        idUnidadTrabajo: this.campos.unidadTrabajo.value,
        unidadTrabajo:
          this.campos.unidadTrabajo.options[
            this.campos.unidadTrabajo.selectedIndex
          ].text,
        idDepartamento: this.campos.departamento.value,
        idEstadoCivil: this.campos.estadoCivil.value,
        idMunicipio: this.campos.municipio.value,
        idTipoDocumento: this.campos.tipoDocumento.value,
        isssempleado: this.campos.numeroAfiliacion.value,
        municipio:
          this.campos.municipio.options[this.campos.municipio.selectedIndex]
            .text,
        nombreArchivoFoto: this.resetPhoto
          ? "default.png"
          : this.nuevaFoto.nombreArchivo ||
            this.data[this.id]?.nombreArchivoFoto ||
            "default.png",
        nombreCompleto: `${this.campos.primerNombre.value} ${this.campos.segundoNombre.value} ${this.campos.primerApellido.value} ${this.campos.segundoApellido.value}`,
        nombreDepartamentoEmpresa:
          this.campos.departamentoEmpresa.options[
            this.campos.departamentoEmpresa.selectedIndex
          ].text,
        nombreEstado:
          this.campos.estado.options[this.campos.estado.selectedIndex].text,
        nombreProfesion:
          this.campos.profesion.options[this.campos.profesion.selectedIndex]
            .text,
        nombreProyecto: proyecto,
        nombreSucursal: sucursal,
        numeroCuenta: this.campos.numeroCuenta.value,
        numeroDocumento: this.campos.numeroDocumento.value,
        nit: this.campos.nit.value,
        numeroTarjeta: this.campos.numeroTarjeta.value,
        nupempleado: this.campos.nup.value,
        pagoPorTransaccion: this.campos.tipoPago.value,
        poseeArma: Number(this.campos.poseeArma.checked),
        primerApellido: this.campos.primerApellido.value,
        primerNombre: this.campos.primerNombre.value,
        salario: this.campos.salario.value,
        segundoApellido: this.campos.segundoApellido.value,
        segundoNombre: this.campos.segundoNombre.value,
        telefonoFijo: this.campos.telefonoFijo.value,
        telefonoMovil: this.campos.telefonoCelular.value,
        tipoDocumento:
          this.campos.tipoDocumento.options[
            this.campos.tipoDocumento.selectedIndex
          ].text,
        tipoPlanilla:
          this.campos.tipoPlanilla.options[
            this.campos.tipoPlanilla.selectedIndex
          ].text,
      });

      for (let key in empleado) {
        if (key.includes("fecha")) {
          empleado[key] = moment(empleado[key], "DD-MM-YYYY").format(
            "YYYY-MM-DD"
          );
        }
      }

      const respuesta = await empleado.guardar();

      switch (respuesta.message) {
        case "success":
          mostrarToastify({
            type: "success",
            message: "Empleado guardado exitosamente",
          });

          empleado.codempleado = respuesta.data.codempleado;
          empleado.nombreArchivoFoto = respuesta.data.nombreArchivoFoto;

          const fila = this.prepararParaFila({
            datos: empleado,
            id: this.id > 0 ? this.id : this.cnt + 1,
          });

          const { codsucursal, codproyecto } =
            this.ubicacion.obtenerUbicacion();

          const codtipoplanilla = this.campos.tipoPlanilla.value;

          if (this.id == 0) {
            this.cnt++;
            this.id = this.cnt;

            if (
              (parseInt(codsucursal) === 0 ||
                parseInt(codsucursal) == empleado.codsucursal) &&
              (parseInt(codproyecto) === 0 ||
                parseInt(codproyecto) == empleado.codproyecto) &&
              (parseInt(codtipoplanilla) === 0 ||
                parseInt(codtipoplanilla) == empleado.codtipoplanilla)
            ) {
              this.tabla.agregarFila({
                datos: fila,
                idFila: `trEmpleado${this.id}`,
              });
            }
          } else {
            this.tabla
              .actualizarFila({ datos: fila, idFila: `trEmpleado${this.id}` })
              .redibujar();
          }

          this.data[this.id] = empleado;

          this.cancelar();
          break;
        default:
          mostrarMensajes.error(respuesta);
          break;
      }
    } catch (err) {
      mostrarMensajes.error(err);
    }
  },
  prepararParaFila: function ({ datos, id }) {
    const colorBorde =
      datos.codestado == 1
        ? "border-primary"
        : datos.codestado == 4
        ? "border-secondary"
        : "border-warning";
    return {
      0: id,
      1: `<div class="tbl-img-container">
        <div class="tbl-img border border-2 ${colorBorde}" style="background-image:url('main/RRHH/assets/images/empleados/${
        datos.nombreArchivoFoto
      }?v=${Math.random()}')"></div>
      </div>`,
      2: datos.codempleado,
      3: `${datos.primerNombre} ${datos.segundoNombre} ${datos.primerApellido} ${datos.segundoApellido}`,
      4: datos.nombreSucursal,
      5: datos.nombreProyecto,
      6: datos.nombreDepartamentoEmpresa,
      7: datos.nombrePuesto,
      8: datos.tipoPlanilla,
      9: datos.nombreEstado,
      10: obtenerHTMLBotonesDropdown([
        {
          tipo: "edit",
          texto: "Editar",
          selectorClase: "editar-empleado",
          selectorId: id,
        },
      ]),
    };
  },
  limpiar: function () {
    return new Promise((resolve) => {
      this.id = 0;
      this.cnt = 0;
      this.tabla.limpiar().redibujar();
      this.data = {};
      resolve();
    });
  },
  cambiarFoto: function () {
    const file = this.campos.archivoFoto.files[0];

    if (!file) return;

    const blobURL = URL.createObjectURL(file),
      nombreArchivo = file.name;

    this.campos.foto.src = blobURL;

    this.nuevaFoto.archivo = file;
    this.nuevaFoto.nombreArchivo = nombreArchivo;
    this.resetPhoto = false;
  },
  eliminarFoto: function () {
    this.campos.foto.src = this.defaultPhoto;
    this.resetPhoto = true;
    this.nuevaFoto.archivo = null;
    this.nuevaFoto.nombreArchivo = null;
  },
  cancelar: function () {
    this.campos.tipoPlanilla.disabled = false;
    this.ubicacion.desbloquear();
    Object.values(this.tabs).forEach((tab) => tab.classList.toggle("disabled"));
    this.tabs.empleados.click();
    Object.values(this.botones).forEach((btn) =>
      btn.classList.toggle("d-none")
    );
  },
};

const configAdjunto = {
  id: 0,
  seleccionado: 0,
  cnt: 0,
  data: {},
  tabla: null,
  campos: {
    archivo: document.getElementById("file-adjuntoEmpleado"),
    tipoDocumento: document.getElementById("cbo-tipoDocumentoAdjunto"),
  },
  archivo: null,
  modal: {
    id: "modal-adjunto",
    mostrar: () => $(`#${configAdjunto.modal.id}`).modal("show"),
    ocultar: () => $(`#${configAdjunto.modal.id}`).modal("hide"),
  },
  inicializar: function ({ tipos }) {
    return new Promise((resolve, reject) => {
      try {
        let opciones = tipos.map(
          (tipo) => `<option value="${tipo.id}">${tipo.tipoDocumento}</option>`
        );

        opciones.length > 0 &&
          opciones.unshift(
            `<option selected disabled value="">Seleccione</option>`
          );

        this.campos.tipoDocumento.innerHTML = opciones.join("");

        resolve();
      } catch (err) {
        reject(err);
      }
    });
  },
  configurar: function ({ adjuntos = [] }) {
    return new Promise(async (resolve, reject) => {
      try {
        await this.limpiar();

        adjuntos.forEach((adjunto) => {
          this.cnt++;
          this.data[this.cnt] = adjunto;

          const fila = this.prepararParaFila({ datos: adjunto, id: this.cnt });

          this.tabla.agregarFila({
            datos: fila,
            idFila: `trAdjunto${this.cnt}`,
          });
        });

        this.tabla.redibujar();

        resolve();
      } catch (err) {
        reject(err);
      }
    });
  },
  editar: async function () {
    await metodosFormularios.limpiar({ id: "adjunto-form" });
    this.limpiarPreviewModal();

    this.modal.mostrar();
  },
  guardar: function () {
    if (!metodosFormularios.validar({ id: "adjunto-form" })) return;

    let archivo = this.archivo || this.campos.archivo.files[0];

    if (!archivo) return;

    //Crear ruta temporal de archivo y obtener nombre
    let rutaTemporal = URL.createObjectURL(archivo),
      nombreArchivo = archivo.name,
      tipoArchivo = archivo.type,
      json = {
        id: 0,
        idTipoDocumento: this.campos.tipoDocumento.value,
        tipoDocumento:
          this.campos.tipoDocumento.options[
            this.campos.tipoDocumento.selectedIndex
          ].text,
        nombreDocumento: nombreArchivo,
        nombreArchivo: nombreArchivo,
        rutaTemporal: rutaTemporal,
        tipoArchivo: tipoArchivo,
        archivoBase64: null,
        archivo,
      };

    this.cnt++;
    this.data[this.cnt] = json;

    let fila = this.prepararParaFila({ datos: json, id: this.cnt });
    this.tabla
      .agregarFila({ datos: fila, idFila: `trAdjunto${this.cnt}` })
      .redibujar();

    this.modal.ocultar();
  },
  prepararParaFila: function ({ datos, id }) {
    return {
      0: id,
      1: datos.tipoDocumento,
      2: datos?.nombreDocumento || datos.nombreArchivo,
      3: obtenerHTMLBotonesDropdown([
        {
          tipo: "delete",
          texto: "Eliminar",
          selectorClase: "eliminar-adjunto",
          selectorId: id,
        },
      ]),
    };
  },
  eliminar: function (id = 0) {
    delete this.data[id];
    this.tabla.eliminarFila({ idFila: `trAdjunto${id}` }).redibujar();
    id == this.seleccionado && this.limpiarPreview();
  },
  mostrarPreview: function (id = 0) {
    let data = this.data[id];

    this.seleccionado = id;

    data.tipoArchivo == "application/pdf"
      ? (document.getElementById("pdf-preview").classList.remove("d-none"),
        document.getElementById("container-image").classList.add("d-none"))
      : (document.getElementById("container-image").classList.remove("d-none"),
        document.getElementById("pdf-preview").classList.add("d-none"));

    let rutaTemporal = data.archivoBase64
      ? URL.createObjectURL(b64toBlob(data.archivoBase64, data.tipoArchivo))
      : data.rutaTemporal;
    if (data.tipoArchivo == "application/pdf") {
      //generar ruta temporal a base de base64

      abrirPDF({
        modulo: data.archivo ? null : `${obtenerNombreModulo()}`,
        nombreArchivo: data.archivo
          ? data.nombreArchivo
          : `empleados/${data.nombreArchivo}`,
        blobURL: data.archivo ? rutaTemporal : null,
        contenedor: "pdf-preview",
      });
    } else {
      document
        .getElementById("image-preview")
        .setAttribute("src", rutaTemporal);
    }
  },
  limpiarPreview: function () {
    this.seleccionado = 0;
    document.getElementById("container-image").classList.add("d-none");
    document.getElementById("pdf-preview").classList.add("d-none");
  },
  mostrarPreviewModal: function () {
    this.limpiarPreviewModal();

    let archivo = this.campos.archivo.files[0];

    if (archivo) {
      this.archivo = archivo;
      archivo.type == "application/pdf"
        ? document
            .getElementById("pdf-preview-modal")
            .classList.remove("d-none")
        : document
            .getElementById("container-image-modal")
            .classList.remove("d-none");
      let rutaTemporal = URL.createObjectURL(archivo);
      if (archivo.type == "application/pdf") {
        abrirPDF({
          modulo: null,
          nombreArchivo: archivo.name,
          blobURL: rutaTemporal,
          contenedor: "pdf-preview-modal",
        });
      } else {
        document
          .getElementById("image-preview-modal")
          .setAttribute("src", rutaTemporal);
      }
    }
  },
  limpiarPreviewModal: function () {
    this.archivo = null;
    // this.campos.archivo.value = "";
    document.getElementById("container-image-modal").classList.add("d-none");
    document.getElementById("pdf-preview-modal").classList.add("d-none");
  },
  limpiar: function () {
    return new Promise((resolve) => {
      this.id = 0;
      this.cnt = 0;
      this.data = {};
      this.tabla.limpiar().redibujar();
      this.limpiarPreview();
      resolve();
    });
  },
  obtenerDatos: function () {
    return Object.values(this.data);
  },
};
