import { Request, Response } from "express";
import sharp from "sharp";
import path from "path";
import fs from "fs";
import { asyncHandler } from "@/core/asyncHandler";
import { AppError } from "@/core/AppError";
import { UPLOADS_DIR } from "./upload.middleware";

// Ensure uploads directory exists
fs.mkdirSync(UPLOADS_DIR, { recursive: true });

interface ThumbnailSpec {
    suffix: string;
    width: number;
    height: number;
}

const THUMBNAILS: ThumbnailSpec[] = [
    { suffix: "_thumb", width: 128, height: 128 },   // catégorie icône / petit
    { suffix: "_medium", width: 400, height: 400 },   // carte produit
];

/**
 * POST /api/shops/:shopId/uploads
 * Accepts a single "image" field.
 * Returns the original URL + thumbnail URLs.
 */
export const uploadImage = asyncHandler(async (req: Request, res: Response) => {
    if (!req.file) {
        throw new AppError("Aucun fichier envoyé", 400);
    }

    const file = req.file;
    const ext = path.extname(file.filename);
    const baseName = path.basename(file.filename, ext);

    const urls: Record<string, string> = {};
    // IMPORTANT : on stocke des URLs RELATIVES (`/uploads/...`) et pas absolues.
    // Rationale : derrière Apache/Nginx (prod) ou Vite dev proxy, l'origin courant du
    // navigateur est toujours le bon. Stocker en relatif évite d'écrire en DB des URLs
    // du type http://192.168.x.x:3000/... quand un upload est fait depuis un poste dev,
    // URLs qui restent valides en prod seulement par accident et deviennent cassées
    // dès qu'on clone la DB pour une release ou qu'on change de domaine public.

    // Original (kept as-is)
    urls.original = `/uploads/${file.filename}`;

    // Generate thumbnails
    for (const spec of THUMBNAILS) {
        const thumbName = `${baseName}${spec.suffix}.webp`;
        const thumbPath = path.join(UPLOADS_DIR, thumbName);

        await sharp(file.path)
            .resize(spec.width, spec.height, { fit: "contain", background: { r: 0, g: 0, b: 0, alpha: 0 } })
            .webp({ quality: 80 })
            .toFile(thumbPath);

        urls[spec.suffix.replace("_", "")] = `/uploads/${thumbName}`;
    }

    res.status(201).json({
        url: urls.original,
        thumb: urls.thumb,
        medium: urls.medium,
        filename: file.filename,
    });
});

