import { NextResponse } from "next/server";
import { extractDataFromInvoice } from "../../../genkit/flow";
import { writeFile, mkdir } from "fs/promises";
import { join } from "path";
import { v4 as uuidv4 } from "uuid";

const corsHeaders = {
  "Access-Control-Allow-Origin": "*",
  "Access-Control-Allow-Methods": "POST, OPTIONS",
  "Access-Control-Allow-Headers": "Content-Type, Authorization",
};

export async function OPTIONS() {
  return new NextResponse(null, { headers: corsHeaders });
}

export async function POST(request: Request) {
  try {
    console.log("📤 [POST /api/upload] Iniciando procesamiento OCR...");

    // Parse del body con manejo de errores
    let body;
    try {
      body = await request.json();
    } catch (parseError) {
      console.error("❌ [UPLOAD] Error al parsear JSON:", parseError);
      return new NextResponse(
        JSON.stringify({ error: "JSON inválido en el request body" }),
        { status: 400, headers: corsHeaders }
      );
    }

    const { imageParts, customFields } = body;

    // Validaciones básicas
    if (!imageParts || !Array.isArray(imageParts) || imageParts.length === 0) {
      console.log("❌ [UPLOAD] No se proporcionaron imágenes");
      return new NextResponse(
        JSON.stringify({ error: "No se proporcionaron imágenes." }),
        { status: 400, headers: corsHeaders }
      );
    }

    console.log(`📷 [UPLOAD] Procesando ${imageParts.length} imagen(es)...`);

    // Guardar archivos localmente en /uploads/processing/
    try {
      const processingDir = join(process.cwd(), "uploads", "processing");
      await mkdir(processingDir, { recursive: true });

      for (let i = 0; i < imageParts.length; i++) {
        const part = imageParts[i];
        const fileExtension = part.mimeType.split("/")[1] || "bin";
        const uniqueFileName = `${uuidv4()}_${Date.now()}.${fileExtension}`;
        const localFilePath = join(processingDir, uniqueFileName);

        const buffer = Buffer.from(part.data, "base64");
        await writeFile(localFilePath, buffer);
        console.log(`✅ [LOCAL] Imagen ${i + 1} guardada: ${uniqueFileName}`);
      }
    } catch (saveError) {
      console.error("⚠️ [LOCAL] Error al guardar localmente (continuando):", saveError);
      // Continuar aunque falle el guardado local
    }

    // Llamar al flow de Genkit
    console.log("🤖 [GENKIT] Enviando a Gemini AI...");
    const result = await extractDataFromInvoice({
      imageParts,
      customFields,
    });

    console.log("✅ [UPLOAD] Procesamiento completado exitosamente");

    return new NextResponse(JSON.stringify(result.extractedData), {
      status: 200,
      headers: { ...corsHeaders, "Content-Type": "application/json" },
    });
  } catch (error) {
    console.error("❌ [UPLOAD] Error en procesamiento:", error);

    const message =
      error instanceof Error ? error.message : "Error desconocido al procesar el documento";

    return new NextResponse(
      JSON.stringify({
        error: message,
        details: error instanceof Error ? error.stack : undefined
      }),
      {
        status: 500,
        headers: { ...corsHeaders, "Content-Type": "application/json" },
      }
    );
  }
}