import { NextResponse } from "next/server";
import { writeFile, mkdir } from "fs/promises";
import path from "path";
import { db } from "@/lib/db";

export async function POST(req: Request) {
  try {
    const formData = await req.formData();
    
    // Extraemos el ID del militante
    const militantId = formData.get("militant_id")?.toString();
    const frontFile = formData.get("front") as File | null;
    const backFile = formData.get("back") as File | null;

    console.log("Procesando subida para Militante ID:", militantId);

    if (!militantId || militantId === "null") {
      return NextResponse.json(
        { error: "El ID del militante es obligatorio para subir documentos." },
        { status: 400 }
      );
    }

    // Definimos la ruta de la carpeta de subidas
    const uploadDir = path.join(process.cwd(), "public", "uploads", "ines");

    // Aseguramos que la carpeta exista (la crea si no existe)
    try {
      await mkdir(uploadDir, { recursive: true });
    } catch (err) {
      console.error("Error al crear carpeta de subidas:", err);
    }

    let frontPath = null;
    let backPath = null;

    // Función auxiliar para procesar y guardar cada archivo
    const saveImage = async (file: File, prefix: string) => {
      const bytes = await file.arrayBuffer();
      const buffer = Buffer.from(bytes);
      
      // Creamos un nombre de archivo único para evitar sobrescribir
      const fileName = `${prefix}_${militantId}_${Date.now()}${path.extname(file.name)}`;
      const filePath = path.join(uploadDir, fileName);
      
      await writeFile(filePath, buffer);
      return `/uploads/ines/${fileName}`;
    };

    // Procesamos el frente si existe
    if (frontFile && frontFile.size > 0) {
      frontPath = await saveImage(frontFile, "frente");
    }

    // Procesamos la vuelta si existe
    if (backFile && backFile.size > 0) {
      backPath = await saveImage(backFile, "vuelta");
    }

    // Actualizamos la base de datos
    // Usamos COALESCE para no borrar rutas existentes si solo se subió una cara
    await db.query(
      `UPDATE militants 
       SET ine_front_path = COALESCE(?, ine_front_path), 
           ine_back_path = COALESCE(?, ine_back_path) 
       WHERE id = ?`,
      [frontPath, backPath, militantId]
    );

    return NextResponse.json({ 
      ok: true, 
      message: "Documentos actualizados correctamente",
      paths: { front: frontPath, back: backPath }
    });

  } catch (error: any) {
    console.error("CRITICAL UPLOAD ERROR:", error);
    return NextResponse.json(
      { error: "Error interno al procesar los archivos: " + error.message },
      { status: 500 }
    );
  }
}