/**
 * POST /api/ugc-generator/extract
 *
 * Ekstrak data produk dari URL (Shopee, Tokopedia, website, dll)
 * menggunakan AI. Tidak ada generate prompt di sini — hanya parsing produk.
 *
 * Body:  { url: string }
 * Response: { success: true, data: ExtractedProduct }
 */

import { NextRequest, NextResponse } from "next/server";
import { createClient } from "@/lib/supabase/server";
import { generatePrompt } from "@/lib/ai/provider";
import { checkRateLimit } from "@/lib/rate-limit";
import { resolveUserEnvVarsCached, hasAnyAiKey } from "@/lib/env-vars-resolver";
import { checkAndIncrementUsage } from "@/lib/usage-quota";
import { isCsrfSafe, csrfForbiddenPayload } from "@/lib/csrf";
import { extractUrlContent } from "@/lib/url-extractor";
import type { ExtractedProduct } from "@/types/ugc-generator";

export const maxDuration = 60;

export async function POST(request: NextRequest) {
  try {
    // BUG-13 FIX: CSRF check
    if (!isCsrfSafe(request)) {
      return NextResponse.json(csrfForbiddenPayload(), { status: 403 });
    }

    // ── Auth ──────────────────────────────────────────────────────────────────
    const supabase = createClient();
    const { data: { user }, error: authError } = await supabase.auth.getUser();
    if (authError || !user) {
      return NextResponse.json({ success: false, error: "Unauthorized" }, { status: 401 });
    }

    // ── Rate limit ────────────────────────────────────────────────────────────
    const rateLimit = await checkRateLimit(user.id);
    if (!rateLimit.allowed) {
      return NextResponse.json(
        { success: false, error: "Rate limit exceeded. Coba lagi dalam 1 menit." },
        { status: 429 }
      );
    }

    // ── Resolve keys ──────────────────────────────────────────────────────────
    const resolvedVars = await resolveUserEnvVarsCached(supabase, user.id);
    if (!hasAnyAiKey(resolvedVars)) {
      return NextResponse.json(
        { success: false, error: "Belum ada AI API key. Tambahkan di Settings → API Keys.", redirectTo: "/settings" },
        { status: 402 }
      );
    }

    // ── Atomic quota check + pre-increment ───────────────────────────────────
    // BUG-09 FIX: Ekstraksi produk menggunakan AI call yang nyata (ada biayanya).
    // Tanpa quota check, user bisa ekstrak unlimited tanpa terhitung di quota mereka.
    const quotaResult = await checkAndIncrementUsage(supabase, user.id, 1);
    if (quotaResult === "quota_exceeded") {
      return NextResponse.json(
        { success: false, error: "Kuota habis. Upgrade plan untuk lebih banyak generasi." },
        { status: 403 }
      );
    }

    // ── Parse body ────────────────────────────────────────────────────────────
    const { url } = await request.json() as { url?: string };
    if (!url || typeof url !== "string") {
      return NextResponse.json({ success: false, error: "URL tidak boleh kosong" }, { status: 400 });
    }

    // ── Fetch konten dari URL ─────────────────────────────────────────────────
    let extracted;
    try {
      extracted = await extractUrlContent(url);
    } catch (e) {
      return NextResponse.json(
        { success: false, error: `Gagal mengambil konten dari URL: ${(e as Error).message}` },
        { status: 422 }
      );
    }

    if (!extracted.body && !extracted.description) {
      return NextResponse.json(
        { success: false, error: "Konten dari URL kosong atau tidak dapat dibaca." },
        { status: 422 }
      );
    }

    // ── AI: ekstrak data produk ───────────────────────────────────────────────
    const systemPrompt = `Kamu adalah ahli ekstraksi data produk e-commerce dan marketing.
Tugasmu: baca konten halaman produk, lalu ekstrak informasi produk terstruktur untuk keperluan pembuatan UGC (User Generated Content).

ATURAN:
1. Ekstrak informasi yang ADA di halaman — jangan mengarang
2. Jika informasi tidak tersedia, isi dengan string kosong ""
3. "masalahPainPoint" = masalah konsumen yang diselesaikan produk ini
4. "manfaatUtama" = 1-2 kalimat manfaat terpenting
5. "fiturKandungan" = bahan aktif / fitur teknis utama (singkat)
6. "targetAudiens" = siapa yang paling cocok pakai produk ini
7. Output HARUS valid JSON — tidak ada teks di luar JSON

OUTPUT FORMAT:
{
  "namaProduk": "...",
  "kategori": "...",
  "deskripsiProduk": "...",
  "masalahPainPoint": "...",
  "manfaatUtama": "...",
  "fiturKandungan": "...",
  "targetAudiens": "...",
  "harga": "..."
}`;

    const userPrompt = `Ekstrak data produk dari halaman berikut:

URL: ${extracted.url}
JUDUL: ${extracted.title}
DESKRIPSI META: ${extracted.description}

KONTEN HALAMAN:
${extracted.body}

Ekstrak semua informasi produk yang relevan untuk pembuatan konten UGC marketing.`;

    const MAX_RETRIES = 2;
    let rawOutput = "";
    let lastError: Error | null = null;

    for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {
      try {
        const response = await generatePrompt(
          [
            { role: "system", content: systemPrompt },
            { role: "user",   content: userPrompt },
          ],
          { temperature: 0.3, maxTokens: 2000 }, // temperature rendah — ini ekstraksi fakta
          resolvedVars
        );
        rawOutput = response.content;
        lastError = null;
        break;
      } catch (e) {
        lastError = e as Error;
        if (attempt < MAX_RETRIES) await new Promise((r) => setTimeout(r, 1000 * (attempt + 1)));
      }
    }

    if (lastError) {
      return NextResponse.json({ success: false, error: lastError.message }, { status: 500 });
    }

    // ── Parse AI output ───────────────────────────────────────────────────────
    let parsed: Partial<ExtractedProduct>;
    try {
      const cleaned = rawOutput.replace(/^```(?:json)?\s*/i, "").replace(/\s*```$/i, "").trim();
      parsed = JSON.parse(cleaned);
    } catch {
      const match = rawOutput.match(/\{[\s\S]*\}/);
      if (!match) {
        return NextResponse.json({ success: false, error: "AI gagal mengekstrak data produk. Coba lagi." }, { status: 500 });
      }
      try { parsed = JSON.parse(match[0]); }
      catch { return NextResponse.json({ success: false, error: "Gagal memparse output AI." }, { status: 500 }); }
    }

    const result: ExtractedProduct = {
      namaProduk:      parsed.namaProduk      || extracted.title || "",
      kategori:        parsed.kategori        || "",
      deskripsiProduk: parsed.deskripsiProduk || extracted.description || "",
      masalahPainPoint:parsed.masalahPainPoint|| "",
      manfaatUtama:    parsed.manfaatUtama    || "",
      fiturKandungan:  parsed.fiturKandungan  || "",
      targetAudiens:   parsed.targetAudiens   || "",
      harga:           parsed.harga           || "",
      imageUrl:        extracted.imageUrl     || undefined,
      sourceUrl:       extracted.url,
    };

    return NextResponse.json(
      { success: true, data: result },
      { headers: { "X-RateLimit-Remaining": String(rateLimit.remaining) } }
    );
  } catch (error) {
    console.error("[ugc-extract]", error);
    return NextResponse.json({ success: false, error: "Internal server error" }, { status: 500 });
  }
}
