import { NextResponse } from "next/server";
import { getServerSession } from "next-auth";
import { authOptions } from "../../auth/[...nextauth]/route";
import { storageAdapter } from "@/lib/adapters/storage";

/**
 * GET /api/files/[filename]
 * Obtener un archivo del storage
 */
export async function GET(
  request: Request,
  { params }: { params: Promise<{ filename: string }> }
) {
  try {
    const session = await getServerSession(authOptions);

    // Verificar autenticación
    if (!session || !session.user) {
      return NextResponse.json({ error: "No autenticado" }, { status: 401 });
    }

    const { filename } = await params;

    // Validar que el nombre de archivo no contenga rutas relativas maliciosas
    if (filename.includes("..") || filename.includes("/") || filename.includes("\\")) {
      return NextResponse.json(
        { error: "Nombre de archivo inválido" },
        { status: 400 }
      );
    }

    // Obtener archivo del storage
    const fileBuffer = await storageAdapter.get(filename);

    // Determinar el tipo de contenido basado en la extensión
    const extension = filename.split(".").pop()?.toLowerCase();
    const contentTypeMap: Record<string, string> = {
      jpg: "image/jpeg",
      jpeg: "image/jpeg",
      png: "image/png",
      gif: "image/gif",
      pdf: "application/pdf",
      webp: "image/webp",
    };

    const contentType = contentTypeMap[extension || ""] || "application/octet-stream";

    // Retornar el archivo (convertir Buffer a Uint8Array)
    return new NextResponse(new Uint8Array(fileBuffer), {
      status: 200,
      headers: {
        "Content-Type": contentType,
        "Cache-Control": "public, max-age=31536000, immutable",
      },
    });
  } catch (error) {
    console.error("❌ [GET /api/files/[filename]] Error:", error);

    if ((error as NodeJS.ErrnoException).code === "ENOENT") {
      return NextResponse.json(
        { error: "Archivo no encontrado" },
        { status: 404 }
      );
    }

    return NextResponse.json(
      { error: "Error al recuperar el archivo" },
      { status: 500 }
    );
  }
}
