import { NextResponse } from "next/server";
import { createAdminClient } from "@/lib/supabase-admin";

function toTrimmed(value: unknown) {
  return String(value || "").trim();
}

function toUuidOrNull(value: unknown) {
  const raw = toTrimmed(value);
  if (!raw) return null;
  return /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(raw) ? raw : null;
}

export async function POST(request: Request) {
  try {
    const body = (await request.json().catch(() => null)) as Record<string, unknown> | null;
    const slug = toTrimmed(body?.slug);
    const eventName = toTrimmed(body?.eventName).toLowerCase();

    if (!slug || !eventName) {
      return NextResponse.json({ ok: false, error: "slug_or_event_missing" }, { status: 400 });
    }

    const supabase = createAdminClient();
    const { data: profile, error: profileError } = await supabase
      .from("profiles")
      .select("id")
      .eq("slug", slug)
      .maybeSingle();

    if (profileError) {
      return NextResponse.json({ ok: false, error: profileError.message }, { status: 400 });
    }

    if (!profile?.id) {
      return NextResponse.json({ ok: false, error: "profile_not_found" }, { status: 404 });
    }

    const payloadBase = {
      user_id: profile.id,
      session_id: toTrimmed(body?.sessionId) || `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`,
      event_name: eventName,
      product_id: toUuidOrNull(body?.productId),
      category_id: toUuidOrNull(body?.categoryId),
      section_id: toUuidOrNull(body?.sectionId),
      search_term: toTrimmed(body?.searchTerm) || null,
      source_path: toTrimmed(body?.sourcePath) || null,
    };

    const metadata =
      body?.meta && typeof body.meta === "object" && !Array.isArray(body.meta)
        ? body.meta
        : {};

    const insertWithMetadata = await supabase
      .from("catalog_events")
      .insert({ ...payloadBase, metadata });

    if (!insertWithMetadata.error) {
      return NextResponse.json({ ok: true });
    }

    const fallbackMessage = String(insertWithMetadata.error.message || "");
    if (!/metadata/i.test(fallbackMessage)) {
      return NextResponse.json({ ok: false, error: fallbackMessage }, { status: 400 });
    }

    const insertWithMeta = await supabase
      .from("catalog_events")
      .insert({ ...payloadBase, meta: metadata } as never);

    if (insertWithMeta.error) {
      return NextResponse.json({ ok: false, error: insertWithMeta.error.message }, { status: 400 });
    }

    return NextResponse.json({ ok: true });
  } catch (error) {
    const message = error instanceof Error ? error.message : "unexpected_error";
    return NextResponse.json({ ok: false, error: message }, { status: 500 });
  }
}
