import { NextResponse } from "next/server";
import { createClient } from "@/lib/supabase/server";
import { chunkDocument } from "@/lib/chunking";

// pdf-parse potrzebuje środowiska Node (nie Edge).
export const runtime = "nodejs";

/**
 * Wgrywanie dokumentu OWU do wspólnej bazy -- odpowiednik src/ingest.py z
 * lokalnego MVP, tylko uruchamiany przez upload w przeglądarce zamiast
 * skryptu w terminalu. Każdy zalogowany użytkownik może dodać dokument do
 * wspólnej biblioteki (patrz RLS w supabase/schema.sql) -- to świadome
 * uproszczenie na etapie małego zespołu/jednej agencji.
 */
export async function POST(request: Request) {
  try {
    const supabase = await createClient();
    const {
      data: { user },
    } = await supabase.auth.getUser();
    if (!user) {
      return NextResponse.json({ error: "Nie zalogowano." }, { status: 401 });
    }

    const formData = await request.formData();
    const file = formData.get("file") as File | null;
    const insurer = (formData.get("insurer") as string) || null;
    const productLine = (formData.get("productLine") as string) || null;

    if (!file) {
      return NextResponse.json({ error: "Nie wybrano pliku." }, { status: 400 });
    }

    const bytes = Buffer.from(await file.arrayBuffer());
    let rawText: string;

    if (file.name.toLowerCase().endsWith(".pdf")) {
      // pdf-parse v2 zmienił API na klasę PDFParse (zamiast domyślnej
      // funkcji z wersji 1.x) -- patrz node_modules/pdf-parse/README.md.
      const { PDFParse } = await import("pdf-parse");
      const parser = new PDFParse({ data: bytes });
      try {
        const parsed = await parser.getText();
        rawText = parsed.text;
      } finally {
        await parser.destroy();
      }
    } else {
      rawText = bytes.toString("utf-8");
    }

    if (!rawText.trim()) {
      return NextResponse.json(
        { error: "Nie udało się odczytać tekstu z pliku (pusty dokument?)." },
        { status: 400 }
      );
    }

    const rawChunks = chunkDocument(rawText);
    if (rawChunks.length === 0) {
      return NextResponse.json(
        { error: "Dokument nie został podzielony na żadne fragmenty." },
        { status: 400 }
      );
    }

    const { data: doc, error: docError } = await supabase
      .from("documents")
      .insert({
        title: file.name,
        source_file: file.name,
        insurer,
        product_line: productLine,
        uploaded_by: user.id,
      })
      .select("id")
      .single();

    if (docError || !doc) {
      return NextResponse.json(
        { error: `Błąd zapisu dokumentu: ${docError?.message}` },
        { status: 500 }
      );
    }

    const rows = rawChunks.map((c) => ({
      document_id: doc.id,
      paragraph_label: c.paragraphLabel,
      chunk_index: c.chunkIndex,
      text: c.text,
    }));

    const { error: chunksError } = await supabase.from("chunks").insert(rows);
    if (chunksError) {
      return NextResponse.json(
        { error: `Błąd zapisu fragmentów: ${chunksError.message}` },
        { status: 500 }
      );
    }

    return NextResponse.json({ ok: true, documentId: doc.id, chunkCount: rows.length });
  } catch (err: unknown) {
    const message = err instanceof Error ? err.message : String(err);
    return NextResponse.json({ error: `Błąd serwera: ${message}` }, { status: 500 });
  }
}
