import { Request, Response } from "express";
import multer from "multer";
import { storagePut } from "../storage";
import crypto from "crypto";
import path from "path";

// Configuration de multer pour l'upload en mémoire
const upload = multer({
  storage: multer.memoryStorage(),
  limits: {
    fileSize: 10 * 1024 * 1024, // 10 Mo max
  },
});

// Middleware pour l'upload d'un seul fichier
export const uploadSingle = upload.single("file");

// Handler pour l'upload de fichier vers S3
export async function handleFileUpload(req: Request, res: Response) {
  try {
    if (!req.file) {
      return res.status(400).json({ error: "Aucun fichier fourni" });
    }

    const file = req.file;
    
    // Générer un nom de fichier unique
    const randomSuffix = crypto.randomBytes(8).toString("hex");
    const ext = path.extname(file.originalname);
    const baseName = path.basename(file.originalname, ext);
    const safeBaseName = baseName.replace(/[^a-zA-Z0-9-_]/g, "_");
    const fileName = `${safeBaseName}-${randomSuffix}${ext}`;
    
    // Chemin S3 pour les pièces jointes de rappels
    const s3Key = `rappels-attachments/${fileName}`;
    
    // Upload vers S3
    const { url, key } = await storagePut(
      s3Key,
      file.buffer,
      file.mimetype
    );
    
    console.log(`[FileUpload] Fichier uploadé: ${fileName} (${file.size} octets)`);
    
    return res.json({
      url,
      key,
      filename: file.originalname,
      mimetype: file.mimetype,
      size: file.size,
    });
  } catch (error) {
    console.error("[FileUpload] Erreur:", error);
    return res.status(500).json({ 
      error: "Erreur lors de l'upload du fichier" 
    });
  }
}
