import { CODEMPRESA } from "../../../../assets/js/app/constantes.js?v=2.0.0";
import { obtenerNombreModulo } from "../../../../assets/js/app/funcionesGenerales.js?v=2.0.0";
import metodosFetch from "../../../../assets/js/app/metodosFetch.js?v=2.0.0";

class Empleado {
  constructor({
    adjuntos = [],
    apellidoCasada,
    archivoFoto,
    codafp,
    codbanco,
    coddepartamento,
    codempleado,
    codempresa,
    codestado,
    codjefe,
    codprofesion,
    codproyecto,
    codpuesto,
    codsucursal,
    codtipoplanilla,
    conocidoPor,
    cotizaAFP,
    cotizaisss,
    datosLicenciaArma = {},
    departamento,
    descripcionRecibo,
    direccion,
    edad,
    email,
    estadoCivil,
    fechaEmisionDUI,
    fechaIngreso,
    fechaInicioCotizacion,
    fechaNacimiento,
    fechaVencimientoDUI,
    genero,
    id,
    idDepartamento,
    idEstadoCivil,
    idMunicipio,
    idPais,
    idTipoDocumento,
    idUnidadTrabajo,
    isssempleado,
    municipio,
    nit,
    nombreArchivoFoto,
    nombreCompleto,
    nombreDepartamentoEmpresa,
    nombreEstado,
    nombreProfesion,
    nombreProyecto,
    nombreSucursal,
    numeroCuenta,
    numeroDocumento,
    numeroTarjeta,
    nupempleado,
    pagoPorTransaccion,
    pais,
    poseeArma,
    primerApellido,
    primerNombre,
    salario,
    segundoApellido,
    segundoNombre,
    telefonoFijo,
    telefonoMovil,
    tipoDocumento,
    tipoPlanilla,
    unidadTrabajo,
  }) {
    this.adjuntos = adjuntos;
    this.apellidoCasada = apellidoCasada;
    this.archivoFoto = archivoFoto;
    this.codafp = codafp;
    this.codbanco = codbanco;
    this.coddepartamento = coddepartamento;
    this.codempleado = codempleado;
    this.codempresa = codempresa;
    this.codestado = codestado;
    this.codjefe = codjefe;
    this.codprofesion = codprofesion;
    this.codproyecto = codproyecto;
    this.codpuesto = codpuesto;
    this.codsucursal = codsucursal;
    this.codtipoplanilla = codtipoplanilla;
    this.conocidoPor = conocidoPor;
    this.cotizaAFP = cotizaAFP;
    this.cotizaisss = cotizaisss;
    this.datosLicenciaArma = datosLicenciaArma;
    this.departamento = departamento;
    this.descripcionRecibo = descripcionRecibo;
    this.direccion = direccion;
    this.edad = edad;
    this.email = email;
    this.estadoCivil = estadoCivil;
    this.fechaEmisionDUI = fechaEmisionDUI;
    this.fechaIngreso = fechaIngreso;
    this.fechaInicioCotizacion = fechaInicioCotizacion;
    this.fechaNacimiento = fechaNacimiento;
    this.fechaVencimientoDUI = fechaVencimientoDUI;
    this.genero = genero;
    this.id = id;
    this.idDepartamento = idDepartamento;
    this.idEstadoCivil = idEstadoCivil;
    this.idMunicipio = idMunicipio;
    this.idPais = idPais;
    this.idTipoDocumento = idTipoDocumento;
    this.idUnidadTrabajo = idUnidadTrabajo;
    this.isssempleado = isssempleado;
    this.municipio = municipio;
    this.nit = nit;
    this.nombreArchivoFoto = nombreArchivoFoto;
    this.nombreCompleto = nombreCompleto;
    this.nombreDepartamentoEmpresa = nombreDepartamentoEmpresa;
    this.nombreEstado = nombreEstado;
    this.nombreProfesion = nombreProfesion;
    this.nombreProyecto = nombreProyecto;
    this.nombreSucursal = nombreSucursal;
    this.numeroCuenta = numeroCuenta;
    this.numeroDocumento = numeroDocumento;
    this.numeroTarjeta = numeroTarjeta;
    this.nupempleado = nupempleado;
    this.pagoPorTransaccion = pagoPorTransaccion;
    this.pais = pais;
    this.poseeArma = poseeArma;
    this.primerApellido = primerApellido;
    this.primerNombre = primerNombre;
    this.salario = salario;
    this.segundoApellido = segundoApellido;
    this.segundoNombre = segundoNombre;
    this.telefonoFijo = telefonoFijo;
    this.telefonoMovil = telefonoMovil;
    this.tipoDocumento = tipoDocumento;
    this.tipoPlanilla = tipoPlanilla;
    this.unidadTrabajo = unidadTrabajo;
  }

  static async obtenerParaDocumentosPago({
    coddepartamento,
    codtipoplanilla,
    correlativo,
  }) {
    try {
      const respuesta = await metodosFetch.get({
        archivo: `controllers/empleadoController`,
        modulo: obtenerNombreModulo(),
        parametros: {
          accion: "obtenerParaDocumentosPago",
          coddepartamento,
          codtipoplanilla,
          correlativo,
        },
      });
      return respuesta;
    } catch (err) {
      throw err;
    }
  }

  async actualizarEmail() {
    try {
      const respuesta = await metodosFetch.post({
        archivo: `controllers/empleadoController`,
        modulo: obtenerNombreModulo(),
        data: {
          accion: "actualizarEmail",
          id: this.id,
          codempleado: this.codempleado,
          email: this.email,
        },
      });

      return respuesta;
    } catch (err) {
      throw err;
    }
  }

  async actualizarDescripcionRecibo() {
    try {
      const respuesta = await metodosFetch.post({
        archivo: `controllers/empleadoController`,
        modulo: obtenerNombreModulo(),
        data: {
          accion: "actualizarDescripcionRecibo",
          id: this.id,
          codempleado: this.codempleado,
          descripcionRecibo: this.descripcionRecibo,
        },
      });

      return respuesta;
    } catch (err) {
      throw err;
    }
  }

  async construirDocumentoPago({
    codtipoplanilla,
    correlativo,
    aguinaldo = 0,
    tipoAccion = "Descargar",
  }) {
    try {
      const respuesta = await metodosFetch.post({
        archivo: `controllers/empleadoController`,
        modulo: obtenerNombreModulo(),
        data: {
          accion: "construirDocumentoPago",
          codtipoplanilla,
          correlativo,
          aguinaldo,
          tipoAccion,
          id: this.id,
          codempleado: this.codempleado,
          codempresa: this.codempresa,
        },
      });

      return respuesta;
    } catch (err) {
      throw err;
    }
  }

  static async obtenerPorTipoPlanilla({
    codempresa = CODEMPRESA,
    codtipoplanilla,
  }) {
    try {
      const respuesta = await metodosFetch.get({
        archivo: `controllers/empleadoController`,
        modulo: obtenerNombreModulo(),
        parametros: {
          accion: "obtenerPorTipoPlanilla",
          codempresa,
          codtipoplanilla,
        },
        loader: false,
      });
      return respuesta;
    } catch (err) {
      throw err;
    }
  }

  static async obtenerPorTipoPlanillaUbicacion({
    codempresa = CODEMPRESA,
    codtipoplanilla,
    codsucursal,
    codproyecto,
    estado = 1,
  }) {
    try {
      const respuesta = await metodosFetch.get({
        archivo: `controllers/empleadoController`,
        modulo: obtenerNombreModulo(),
        parametros: {
          accion: "obtenerPorTipoPlanillaUbicacion",
          codempresa,
          codtipoplanilla,
          codsucursal,
          codproyecto,
          estado,
        },
        loader: false,
      });
      return respuesta;
    } catch (err) {
      throw err;
    }
  }

  static async obtenerCatalogosGestion() {
    try {
      const respuesta = await metodosFetch.get({
        archivo: `controllers/empleadoController`,
        modulo: obtenerNombreModulo(),
        parametros: {
          accion: "obtenerCatalogosGestion",
        },
        loader: false,
      });
      return respuesta;
    } catch (err) {
      throw err;
    }
  }

  async guardar() {
    try {
      const data = new FormData();
      data.append("accion", "guardar");

      const exceptuados = ["datosLicenciaArma", "adjuntos"];

      for (const propiedad in this) {
        if (!exceptuados.includes(propiedad)) {
          data.append(propiedad, this[propiedad]);
        }
      }

      let contadorArchivos = 0;

      this.adjuntos.forEach((adjunto) => {
        contadorArchivos++;

        adjunto.cnt = contadorArchivos;
        if (adjunto.archivo) {
          data.append(`archivo${contadorArchivos}`, adjunto.archivo);
        }
      });

      data.append("datosLicenciaArma", JSON.stringify(this.datosLicenciaArma));
      data.append("adjuntos", JSON.stringify(this.adjuntos));

      const respuesta = await metodosFetch.postWithFiles({
        archivo: `controllers/empleadoController`,
        modulo: obtenerNombreModulo(),
        data,
      });

      return respuesta;
    } catch (err) {
      throw err;
    }
  }

  static async obtenerComplementoGestion({ codempleado }) {
    try {
      const respuesta = await metodosFetch.get({
        archivo: `controllers/empleadoController`,
        modulo: obtenerNombreModulo(),
        parametros: {
          accion: "obtenerComplementoGestion",
          codempleado,
        },
        loader: false,
      });

      return respuesta;
    } catch (err) {
      throw err;
    }
  }
}

export default Empleado;
