import { redirect } from "next/navigation";
import { revalidatePath } from "next/cache";
import { requireOrg, canEditLeads } from "@/lib/ctx";
import { parseChat, extractRef, normalizePhone, sha256 } from "@/lib/chat-parser";
import { ingestChat } from "@/lib/pipeline";

export const maxDuration = 60; // scoring AI bisa makan beberapa detik

const s = (fd: FormData, k: string) => String(fd.get(k) ?? "").trim();

async function readChat(fd: FormData): Promise<string> {
  const f = fd.get("chat_file");
  if (f instanceof File && f.size > 0) return await f.text();
  return s(fd, "chat_text");
}

async function createLead(fd: FormData) {
  "use server";
  const c = await requireOrg();
  if (!canEditLeads(c.role)) redirect("/leads");

  const raw = await readChat(fd);
  const msgs = parseChat(raw);
  if (!msgs.length) redirect("/leads/new?e=chat");

  const sender = msgs[0].sender;
  const phone = normalizePhone(s(fd, "phone")) ?? normalizePhone(sender);
  if (!phone) redirect("/leads/new?e=phone");
  const sha = sha256(phone);

  // nomor yang sama = lead yang sama (chat baru ditambahkan ke lead itu)
  const { data: dup } = await c.db.from("leads").select("id").eq("org_id", c.orgId).eq("phone_sha256", sha).limit(1);
  let leadId: string;
  if (dup && dup.length) {
    leadId = dup[0].id;
  } else {
    // Ref dari form, atau dibaca otomatis dari pesan pertama customer
    const ref = (s(fd, "ref") || extractRef(msgs) || "").toUpperCase();
    let clickId: string | null = null;
    if (ref) {
      const { data: click } = await c.admin.from("clicks").select("id").eq("org_id", c.orgId).eq("ref_code", ref).maybeSingle();
      clickId = click?.id ?? null;
    }
    const name = s(fd, "name") || (normalizePhone(sender) ? null : sender);
    const { data: lead, error } = await c.admin
      .from("leads")
      .insert({
        org_id: c.orgId,
        source_click_id: clickId,
        assigned_to: c.user.id,
        customer_name: name,
        phone,
        phone_sha256: sha,
        first_message_at: msgs[0].ts,
        last_message_at: msgs[msgs.length - 1].ts,
      })
      .select("id")
      .single();
    if (error || !lead) redirect("/leads/new?e=db");
    leadId = lead.id;
  }

  await ingestChat({ orgId: c.orgId, leadId, userId: c.user.id, rawText: raw, msgs });
  revalidatePath("/leads");
  redirect(`/leads/${leadId}`);
}

const ERR: Record<string, string> = {
  chat: "Isi chat tidak terbaca. Pastikan formatnya hasil Ekspor Chat WhatsApp.",
  phone: "Nomor customer tidak terbaca. Isi nomor WA customer secara manual.",
  db: "Gagal menyimpan lead. Coba lagi.",
};

export default async function NewLead({ searchParams }: { searchParams: Promise<{ e?: string }> }) {
  const { e } = await searchParams;
  const c = await requireOrg();
  if (!canEditLeads(c.role)) redirect("/leads");

  return (
    <>
      <h1>Lead baru dari chat</h1>
      {e && <div className="alert">{ERR[e] ?? "Terjadi kesalahan."}</div>}
      <form action={createLead} className="card">
        <p className="muted">
          Di WhatsApp Business: buka chat → ⋮ → Lainnya → Ekspor chat → <b>Tanpa media</b>. Lalu tempel isinya di bawah atau unggah file .txt-nya.
          Kode Ref dan nomor customer dibaca otomatis dari chat kalau tersedia.
        </p>
        <label htmlFor="chat_text">Tempel isi chat</label>
        <textarea id="chat_text" name="chat_text" placeholder="12/05/2026 14.32 - Budi: Halo, saya mau tanya produknya. Ref: A7K2X" />
        <label htmlFor="chat_file">…atau unggah file ekspor (.txt)</label>
        <input id="chat_file" name="chat_file" type="file" accept=".txt,text/plain" />
        <div className="row fill">
          <div><label htmlFor="phone">Nomor WA customer (opsional)</label><input id="phone" name="phone" inputMode="tel" placeholder="0812…" /></div>
          <div><label htmlFor="name">Nama (opsional)</label><input id="name" name="name" /></div>
          <div><label htmlFor="ref">Kode Ref (opsional)</label><input id="ref" name="ref" placeholder="A7K2X" maxLength={5} /></div>
        </div>
        <p><button className="btn">Simpan &amp; analisis</button></p>
      </form>
    </>
  );
}
