import { Request } from "express";
import fs from "fs";
import multer, { FileFilterCallback } from "multer";
import path from "path";

// Tipos personalizados para mejorar la legibilidad
type MimeType = string;
type MaxSize = number;
type UploadFolder = string;

type CreateUploadMiddlewareOptions = {
  mimeTypes: MimeType[];
  maxSize: MaxSize;
  uploadFolder: UploadFolder;
};

export const ensureUploadFolderExists = (folderPath: string) => {
  if (!fs.existsSync(folderPath)) {
    fs.mkdirSync(folderPath, { recursive: true });
  }
};

// Función para configurar Multer
export function createMulterMiddleware(options: CreateUploadMiddlewareOptions) {
  const { mimeTypes, maxSize, uploadFolder } = options;

  ensureUploadFolderExists(uploadFolder);

  // Configuración del almacenamiento3
  const storage = multer.diskStorage({
    destination: (req, file, cb) => {
      cb(null, uploadFolder); // Carpeta donde se almacenan los archivos
    },
    filename: (req, file, cb) => {
      const ext = path.extname(file.originalname);
      const name = path.basename(file.originalname, ext);
      const timestamp = Date.now();
      cb(null, `${name}-${timestamp}${ext}`);
    },
  });

  // Filtro de archivos basado en mimetypes
  const fileFilter = (req: Request, file: Express.Multer.File, cb: FileFilterCallback) => {
    if (mimeTypes.includes(file.mimetype)) {
      cb(null, true);
    } else {
      cb(new Error("Tipo de archivo no permitido"));
    }
  };

  // Crear y devolver el middleware de Multer con la configuración personalizada
  return multer({
    storage: storage,
    fileFilter: fileFilter,
    limits: { fileSize: maxSize }, // Tamaño máximo del archivo
  });
}
