import { NextResponse } from "next/server";
import { writeFile, mkdir } from "fs/promises";
import path from "path";
import { FieldValue } from "firebase-admin/firestore";
import { adminDb } from "@/lib/firebase-admin";

function getExtension(filename: string): string {
  const ext = path.extname(filename) || "";
  if (ext) return ext;
  return ".jpg";
}

export async function GET(request: Request) {
  try {
    const { searchParams } = new URL(request.url);
    const barcode = searchParams.get("barcode");

    if (!barcode?.trim()) {
      return NextResponse.json({ error: "barcode query required" }, { status: 400 });
    }

    const snap = await adminDb
      .collection("products")
      .where("barcode", "==", barcode.trim())
      .limit(1)
      .get();

    if (snap.empty) {
      return NextResponse.json({ product: null });
    }

    const doc = snap.docs[0];
    const d = doc.data();
    const product = {
      id: doc.id,
      barcode: d.barcode ?? "",
      brandName: d.brandName ?? "",
      companyName: d.companyName ?? "",
      productName: d.productName ?? "",
      manufacturedIn: d.manufacturedIn ?? "",
      description: d.description ?? "",
      certificateBodies: d.certificateBodies ?? "",
      certificateExpiry: d.certificateExpiry ?? "",
      ingredients: d.ingredients ?? "",
      nutrition: d.nutrition ?? "",
      kcalPerUnit: d.kcalPerUnit ?? 0,
      productImageAsset: d.productImageAsset ?? d.imageUrl ?? "",
      last4Digits: d.last4Digits ?? "",
      createdAt: d.createdAt?.toDate?.()?.toISOString?.() ?? null,
    };

    return NextResponse.json({ product });
  } catch (error) {
    console.error("products API error:", error);
    const msg = error instanceof Error ? error.message : "Failed to fetch product";
    return NextResponse.json({ error: msg }, { status: 500 });
  }
}

export async function POST(request: Request) {
  try {
    const formData = await request.formData();
    const barcode = (formData.get("barcode") as string)?.trim();
    const brandName = (formData.get("brandName") as string)?.trim();
    const companyName = (formData.get("companyName") as string)?.trim();
    const productName = (formData.get("productName") as string)?.trim();
    const manufacturedIn = (formData.get("manufacturedIn") as string)?.trim();
    const description = (formData.get("description") as string)?.trim();
    const certificateBodies = (formData.get("certificateBodies") as string)?.trim();
    const certificateExpiry = (formData.get("certificateExpiry") as string)?.trim();
    const ingredients = (formData.get("ingredients") as string)?.trim();
    const nutrition = (formData.get("nutrition") as string)?.trim();
    const kcalStr = formData.get("kcalPerUnit") as string;
    const last4Digits = (formData.get("last4Digits") as string)?.trim();
    const image = formData.get("image") as File | null;

    if (!barcode || !productName) {
      return NextResponse.json(
        { error: "barcode and productName required" },
        { status: 400 }
      );
    }

    let productImageAsset = "";

    if (image && image.size > 0) {
      try {
        const bytes = await image.arrayBuffer();
        const buffer = Buffer.from(bytes);
        const ext = getExtension(image.name);
        const filename = `${Date.now()}${ext}`;
        const uploadDir = path.join(process.cwd(), "public", "products");
        await mkdir(uploadDir, { recursive: true });
        const filepath = path.join(uploadDir, filename);
        await writeFile(filepath, buffer);
        productImageAsset = `/api/images/${filename}`;
      } catch (imgErr) {
        console.warn("Image upload skipped:", imgErr);
      }
    }

    const last4 = last4Digits || barcode.slice(-4);

    const docRef = await adminDb.collection("products").add({
      barcode,
      brandName: brandName || "",
      companyName: companyName || "",
      productName,
      manufacturedIn: manufacturedIn || "",
      description: description || "",
      certificateBodies: certificateBodies || "",
      certificateExpiry: certificateExpiry || "",
      ingredients: ingredients || "",
      nutrition: nutrition || "",
      kcalPerUnit: kcalStr ? parseFloat(kcalStr) : 0,
      productImageAsset,
      last4Digits: last4,
      name: productName,
      imageUrl: productImageAsset,
      createdAt: FieldValue.serverTimestamp(),
    });

    return NextResponse.json({ id: docRef.id });
  } catch (error) {
    console.error("products POST error:", error);
    const msg = error instanceof Error ? error.message : "Failed to add product";
    return NextResponse.json({ error: msg }, { status: 500 });
  }
}
