"use client";

import { useMemo, useState } from "react";
import { Card, CardContent } from "@/components/ui/card";
import { Button } from "@/components/ui/button";
import { Badge } from "@/components/ui/badge";
import { Input } from "@/components/ui/input";
import { Kpi, KpiStrip } from "@/components/ui/kpi";
import { EmptyState } from "@/components/ui/empty-state";
import { useAlertConfirm } from "@/components/ui/alert-dialog";
import { useLocalStorage } from "@/lib/hooks/use-local-storage";
import { ALL_ORGANIZATIONS } from "@/lib/sag/entities";
import { formatCurrency } from "@/lib/utils";
import { logActivity } from "@/lib/activity/log";

// ──────────────────────────────────────────────────────────────────────────
// Data model
// ──────────────────────────────────────────────────────────────────────────

export type NcdorFilingStatus = "Unfiled" | "Drafted" | "Submitted" | "Paid" | "Late";

export interface NcdorFiling {
  id: string;
  entitySlug: string;
  periodYear: number;
  periodMonth: number; // 1-12
  grossSales?: number;
  taxableSales?: number;
  taxOwed?: number;
  status: NcdorFilingStatus;
  filedDate?: string;
  confirmationNumber?: string;
  notes?: string;
  createdAt: string;
}

// NC state sales tax 4.75% + average local 2.25% ≈ 7% combined default.
const DEFAULT_TAX_RATE = 0.07;

// Industries that operate retail/hospitality and owe NC E-500.
const QUALIFYING_INDUSTRIES = new Set(["Hospitality", "Food & Beverage", "Recreation"]);

const STATUS_TONE: Record<NcdorFilingStatus, "outline" | "info" | "success" | "destructive" | "warning"> = {
  Unfiled: "outline",
  Drafted: "warning",
  Submitted: "info",
  Paid: "success",
  Late: "destructive",
};

const MONTH_NAMES = [
  "January",
  "February",
  "March",
  "April",
  "May",
  "June",
  "July",
  "August",
  "September",
  "October",
  "November",
  "December",
];

// ──────────────────────────────────────────────────────────────────────────
// Helpers
// ──────────────────────────────────────────────────────────────────────────

function getQualifyingEntities() {
  return ALL_ORGANIZATIONS.filter(
    (o) => o.status === "Active" && QUALIFYING_INDUSTRIES.has(o.industry)
  );
}

/**
 * E-500 is due on the 20th of the month FOLLOWING the period.
 * Returns ISO YYYY-MM-DD due date for a (year, month) reporting period.
 */
function getDueDate(periodYear: number, periodMonth: number): string {
  // periodMonth is 1-12; due is 20th of next month.
  const due = new Date(Date.UTC(periodYear, periodMonth, 20)); // month index = periodMonth + 1 - 1
  return due.toISOString().slice(0, 10);
}

function getCurrentPeriod(): { year: number; month: number } {
  const now = new Date();
  return { year: now.getUTCFullYear(), month: now.getUTCMonth() + 1 };
}

function getPreviousMonths(count: number): Array<{ year: number; month: number }> {
  const out: Array<{ year: number; month: number }> = [];
  const now = new Date();
  for (let i = 0; i < count; i++) {
    const d = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth() - i, 1));
    out.push({ year: d.getUTCFullYear(), month: d.getUTCMonth() + 1 });
  }
  return out;
}

function periodKey(year: number, month: number): string {
  return `${year}-${String(month).padStart(2, "0")}`;
}

function todayIso(): string {
  return new Date().toISOString().slice(0, 10);
}

// ──────────────────────────────────────────────────────────────────────────
// Main component
// ──────────────────────────────────────────────────────────────────────────

export function NcdorTracker() {
  const [filings, setFilings] = useLocalStorage<NcdorFiling[]>("sag.compliance.ncdor", []);
  const [showAdd, setShowAdd] = useState(false);
  const [showAllEntities, setShowAllEntities] = useState(false);
  const [editingId, setEditingId] = useState<string | null>(null);
  const { confirm: confirmAlert, AlertConfirmPortal } = useAlertConfirm();

  const qualifyingEntities = useMemo(() => getQualifyingEntities(), []);
  const entityOptions = showAllEntities ? ALL_ORGANIZATIONS : qualifyingEntities;

  const current = getCurrentPeriod();
  const lookbackPeriods = useMemo(() => getPreviousMonths(4), []); // current + 3 previous
  const today = todayIso();

  // Derive status with auto-Late for past-due unfiled filings.
  const derived = useMemo(
    () =>
      filings.map((f) => {
        if (f.status === "Paid" || f.status === "Submitted") return f;
        const due = getDueDate(f.periodYear, f.periodMonth);
        if (due < today && (f.status === "Unfiled" || f.status === "Drafted")) {
          return { ...f, status: "Late" as NcdorFilingStatus };
        }
        return f;
      }),
    [filings, today]
  );

  // Build set of (entitySlug, periodKey) keys for existing filings (for next-needed default).
  const filedSet = useMemo(() => {
    const s = new Set<string>();
    for (const f of derived) {
      s.add(`${f.entitySlug}|${periodKey(f.periodYear, f.periodMonth)}`);
    }
    return s;
  }, [derived]);

  // Pending filings panel: current + previous 3 months × qualifying entities.
  type PendingRow = {
    entitySlug: string;
    periodYear: number;
    periodMonth: number;
    filing?: NcdorFiling;
    dueDate: string;
    isOverdue: boolean;
  };

  const pendingRows = useMemo<PendingRow[]>(() => {
    const rows: PendingRow[] = [];
    for (const p of lookbackPeriods) {
      for (const e of qualifyingEntities) {
        const filing = derived.find(
          (f) =>
            f.entitySlug === e.slug && f.periodYear === p.year && f.periodMonth === p.month
        );
        const dueDate = getDueDate(p.year, p.month);
        rows.push({
          entitySlug: e.slug,
          periodYear: p.year,
          periodMonth: p.month,
          filing,
          dueDate,
          isOverdue: dueDate < today && (!filing || (filing.status !== "Submitted" && filing.status !== "Paid")),
        });
      }
    }
    return rows.sort((a, b) => a.dueDate.localeCompare(b.dueDate));
  }, [lookbackPeriods, qualifyingEntities, derived, today]);

  // KPIs
  const currentMonthOwed = qualifyingEntities.length;
  const overdueCount = pendingRows.filter((r) => r.isOverdue).length;

  const ytdYear = current.year;
  const ytdFilings = derived.filter((f) => f.periodYear === ytdYear);
  const ytdTaxOwed = ytdFilings.reduce((a, f) => a + (f.taxOwed ?? 0), 0);
  const ytdTaxPaid = ytdFilings
    .filter((f) => f.status === "Paid")
    .reduce((a, f) => a + (f.taxOwed ?? 0), 0);

  // Reminders: filing for current or previous month is "Unfiled" past the 20th.
  const reminderRows = pendingRows.filter((r) => {
    const isCurrentOrLast =
      (r.periodYear === current.year && r.periodMonth === current.month) ||
      (r.periodYear === current.year && r.periodMonth === current.month - 1) ||
      (current.month === 1 && r.periodYear === current.year - 1 && r.periodMonth === 12);
    if (!isCurrentOrLast) return false;
    const dayOfMonth = parseInt(today.slice(8, 10), 10);
    const isPastDue = dayOfMonth > 20 || r.dueDate < today;
    const unfiled = !r.filing || r.filing.status === "Unfiled" || r.filing.status === "Drafted" || r.filing.status === "Late";
    return isPastDue && unfiled;
  });

  function addFiling(data: Omit<NcdorFiling, "id" | "createdAt">) {
    setFilings((prev) => [
      ...prev,
      {
        ...data,
        id: `ncdor-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`,
        createdAt: new Date().toISOString(),
      },
    ]);
    try {
      const periodLabel = `${MONTH_NAMES[data.periodMonth - 1]} ${data.periodYear}`;
      logActivity({
        source: "ncdor",
        verb: "created",
        title: `Added E-500 filing for ${periodLabel}`,
        entitySlug: data.entitySlug,
        amount: data.taxOwed,
        href: "/app/compliance/ncdor",
        meta: { status: data.status, periodYear: data.periodYear, periodMonth: data.periodMonth },
      });
    } catch {
      // fire-and-forget
    }
  }

  function updateFiling(id: string, patch: Partial<NcdorFiling>) {
    const existing = filings.find((f) => f.id === id);
    setFilings((prev) => prev.map((f) => (f.id === id ? { ...f, ...patch } : f)));
    if (!existing) return;
    try {
      const nextStatus = patch.status ?? existing.status;
      const periodLabel = `${MONTH_NAMES[existing.periodMonth - 1]} ${existing.periodYear}`;
      const verb =
        patch.status === "Submitted"
          ? "submitted"
          : patch.status === "Paid"
            ? "marked-paid"
            : "updated";
      const title =
        verb === "submitted"
          ? `Submitted E-500 for ${periodLabel}`
          : verb === "marked-paid"
            ? `Marked E-500 paid for ${periodLabel}`
            : `Updated E-500 for ${periodLabel}`;
      logActivity({
        source: "ncdor",
        verb,
        title,
        entitySlug: existing.entitySlug,
        amount: patch.taxOwed ?? existing.taxOwed,
        href: "/app/compliance/ncdor",
        meta: { status: nextStatus },
      });
    } catch {
      // fire-and-forget
    }
  }

  async function deleteFiling(id: string) {
    const ok = await confirmAlert({
      title: "Delete this filing?",
      description: "This permanently removes the record. Cannot be undone.",
      actionLabel: "Delete",
      destructive: true,
    });
    if (!ok) return;
    const existing = filings.find((f) => f.id === id);
    setFilings((prev) => prev.filter((f) => f.id !== id));
    try {
      if (existing) {
        const periodLabel = `${MONTH_NAMES[existing.periodMonth - 1]} ${existing.periodYear}`;
        logActivity({
          source: "ncdor",
          verb: "deleted",
          title: `Deleted E-500 filing for ${periodLabel}`,
          entitySlug: existing.entitySlug,
          amount: existing.taxOwed,
          href: "/app/compliance/ncdor",
        });
      }
    } catch {
      // fire-and-forget
    }
  }

  function markSubmitted(id: string) {
    updateFiling(id, { status: "Submitted", filedDate: todayIso() });
  }

  function markPaid(id: string) {
    updateFiling(id, { status: "Paid", filedDate: todayIso() });
  }

  // Default entity for new filing: first qualifying entity without a filing for current month.
  const defaultEntitySlug = useMemo(() => {
    const cur = periodKey(current.year, current.month);
    const needed = qualifyingEntities.find((e) => !filedSet.has(`${e.slug}|${cur}`));
    return needed?.slug ?? qualifyingEntities[0]?.slug ?? "south-armz-global";
  }, [qualifyingEntities, filedSet, current.year, current.month]);

  return (
    <>
    <div className="space-y-6">
      <KpiStrip cols={4}>
        <Kpi
          label="Entities owed (current)"
          value={String(currentMonthOwed)}
          hint={`${MONTH_NAMES[current.month - 1]} ${current.year}`}
        />
        <Kpi
          label="Filings overdue"
          value={String(overdueCount)}
          tone={overdueCount > 0 ? "rose" : "neutral"}
        />
        <Kpi label="Tax owed YTD" value={formatCurrency(ytdTaxOwed)} />
        <Kpi label="Tax paid YTD" value={formatCurrency(ytdTaxPaid)} tone="emerald" />
      </KpiStrip>

      {reminderRows.length > 0 && (
        <Card className="border-destructive/50 bg-destructive/5">
          <CardContent className="p-4">
            <div className="flex items-start gap-3">
              <div className="text-2xl">⚠️</div>
              <div className="flex-1">
                <div className="text-sm font-semibold text-destructive">
                  {reminderRows.length} E-500 filing{reminderRows.length === 1 ? "" : "s"}{" "}
                  past due
                </div>
                <p className="mt-1 text-xs text-muted-foreground">
                  E-500 is due the 20th of the month following the reporting period. The
                  following are unfiled or in draft past their due date:
                </p>
                <ul className="mt-2 space-y-1">
                  {reminderRows.map((r) => {
                    const org = ALL_ORGANIZATIONS.find((o) => o.slug === r.entitySlug);
                    return (
                      <li key={`${r.entitySlug}-${r.periodYear}-${r.periodMonth}`} className="text-xs">
                        <span className="font-mono text-muted-foreground">{r.dueDate}</span>{" "}
                        — {org?.emoji} {org?.name} · {MONTH_NAMES[r.periodMonth - 1]}{" "}
                        {r.periodYear}
                      </li>
                    );
                  })}
                </ul>
              </div>
            </div>
          </CardContent>
        </Card>
      )}

      <Card>
        <CardContent className="p-4 flex items-center flex-wrap gap-2">
          <div className="text-xs text-muted-foreground">
            Showing {showAllEntities ? "all" : "qualifying"} entities ·{" "}
            <button
              type="button"
              className="underline hover:text-foreground"
              onClick={() => setShowAllEntities((v) => !v)}
            >
              {showAllEntities ? "Show qualifying only" : "Show all entities"}
            </button>
          </div>
          <div className="ml-auto">
            <Button
              size="sm"
              variant={showAdd ? "outline" : "brand"}
              onClick={() => setShowAdd((v) => !v)}
            >
              {showAdd ? "Cancel" : "+ Add filing"}
            </Button>
          </div>
        </CardContent>
      </Card>

      {showAdd && (
        <FilingForm
          entities={entityOptions}
          defaultEntitySlug={defaultEntitySlug}
          defaultYear={current.year}
          defaultMonth={current.month}
          onSubmit={(data) => {
            addFiling(data);
            setShowAdd(false);
          }}
          onCancel={() => setShowAdd(false)}
        />
      )}

      <section className="space-y-2">
        <h2 className="text-sm font-semibold text-muted-foreground uppercase tracking-wider">
          Filings — current + last 3 months
        </h2>
        {pendingRows.length === 0 ? (
          <EmptyState
            icon="🧾"
            title="No qualifying entities found"
            description="NCDOR E-500 filings are only required for retail/hospitality entities."
          />
        ) : (
          <div className="rounded-md border bg-card overflow-x-auto">
            <table className="w-full text-sm min-w-[720px]">
              <thead className="section-label border-b">
                <tr>
                  <th className="px-3 py-2 text-left">Entity</th>
                  <th className="px-3 py-2 text-left">Period</th>
                  <th className="px-3 py-2 text-left">Due</th>
                  <th className="px-3 py-2 text-right">Gross sales</th>
                  <th className="px-3 py-2 text-right">Tax owed</th>
                  <th className="px-3 py-2 text-left">Status</th>
                  <th className="px-3 py-2 text-right">Actions</th>
                </tr>
              </thead>
              <tbody>
                {pendingRows.map((r) => {
                  const org = ALL_ORGANIZATIONS.find((o) => o.slug === r.entitySlug);
                  const f = r.filing;
                  const isEditing = editingId && f?.id === editingId;
                  return (
                    <tr
                      key={`${r.entitySlug}-${r.periodYear}-${r.periodMonth}`}
                      className={`border-b last:border-0 ${r.isOverdue ? "bg-destructive/5" : ""}`}
                    >
                      <td className="px-3 py-2">
                        <span className="inline-flex items-center gap-1">
                          {org?.emoji} {org?.name}
                        </span>
                      </td>
                      <td className="px-3 py-2 font-mono text-xs">
                        {MONTH_NAMES[r.periodMonth - 1].slice(0, 3)} {r.periodYear}
                      </td>
                      <td className="px-3 py-2 font-mono text-xs">{r.dueDate}</td>
                      <td className="px-3 py-2 text-right tabular-nums">
                        {f?.grossSales != null ? formatCurrency(f.grossSales) : "—"}
                      </td>
                      <td className="px-3 py-2 text-right tabular-nums">
                        {f?.taxOwed != null ? formatCurrency(f.taxOwed) : "—"}
                      </td>
                      <td className="px-3 py-2">
                        {f ? (
                          <Badge variant={STATUS_TONE[f.status]}>{f.status}</Badge>
                        ) : (
                          <Badge variant="outline">Unfiled</Badge>
                        )}
                      </td>
                      <td className="px-3 py-2 text-right">
                        <div className="inline-flex items-center gap-1 flex-wrap justify-end">
                          {f && f.status !== "Submitted" && f.status !== "Paid" && (
                            <Button
                              size="sm"
                              variant="outline"
                              onClick={() => markSubmitted(f.id)}
                            >
                              Submitted
                            </Button>
                          )}
                          {f && f.status !== "Paid" && (
                            <Button
                              size="sm"
                              variant="brand"
                              onClick={() => markPaid(f.id)}
                            >
                              Paid
                            </Button>
                          )}
                          {f && (
                            <Button
                              size="sm"
                              variant="ghost"
                              onClick={() => setEditingId(isEditing ? null : f.id)}
                            >
                              {isEditing ? "Close" : "Edit"}
                            </Button>
                          )}
                          {f && (
                            <Button size="sm" variant="ghost" onClick={() => deleteFiling(f.id)}>
                              ×
                            </Button>
                          )}
                          {!f && (
                            <Button
                              size="sm"
                              variant="outline"
                              onClick={() => {
                                addFiling({
                                  entitySlug: r.entitySlug,
                                  periodYear: r.periodYear,
                                  periodMonth: r.periodMonth,
                                  status: "Drafted",
                                });
                              }}
                            >
                              Start
                            </Button>
                          )}
                        </div>
                      </td>
                    </tr>
                  );
                })}
              </tbody>
            </table>
          </div>
        )}
      </section>

      {editingId &&
        (() => {
          const f = filings.find((x) => x.id === editingId);
          if (!f) return null;
          return (
            <FilingForm
              key={editingId}
              entities={entityOptions}
              defaultEntitySlug={f.entitySlug}
              defaultYear={f.periodYear}
              defaultMonth={f.periodMonth}
              initial={f}
              onSubmit={(data) => {
                updateFiling(editingId, data);
                setEditingId(null);
              }}
              onCancel={() => setEditingId(null)}
              submitLabel="Save filing"
            />
          );
        })()}

      <p className="text-xs text-muted-foreground">
        E-500 returns are filed via the NCDOR eServices portal. Default combined sales-and-use
        rate of 7.00% (4.75% state + ≈2.25% local) is editable per row. Filings saved locally
        in this browser. Quarterly filers should still log each month&apos;s gross to keep totals
        accurate.
      </p>
    </div>
    <AlertConfirmPortal />
    </>
  );
}

// ──────────────────────────────────────────────────────────────────────────
// Add / Edit Filing form
// ──────────────────────────────────────────────────────────────────────────

function FilingForm({
  entities,
  defaultEntitySlug,
  defaultYear,
  defaultMonth,
  initial,
  onSubmit,
  onCancel,
  submitLabel = "Add filing",
}: {
  entities: typeof ALL_ORGANIZATIONS;
  defaultEntitySlug: string;
  defaultYear: number;
  defaultMonth: number;
  initial?: NcdorFiling;
  onSubmit: (data: Omit<NcdorFiling, "id" | "createdAt">) => void;
  onCancel: () => void;
  submitLabel?: string;
}) {
  const [entitySlug, setEntitySlug] = useState(initial?.entitySlug ?? defaultEntitySlug);
  const [periodYear, setPeriodYear] = useState(initial?.periodYear ?? defaultYear);
  const [periodMonth, setPeriodMonth] = useState(initial?.periodMonth ?? defaultMonth);
  const [grossSales, setGrossSales] = useState(
    initial?.grossSales != null ? String(initial.grossSales) : ""
  );
  const [taxableSales, setTaxableSales] = useState(
    initial?.taxableSales != null ? String(initial.taxableSales) : ""
  );
  const [taxRate, setTaxRate] = useState(
    initial?.grossSales && initial.taxOwed
      ? String(((initial.taxOwed / (initial.taxableSales ?? initial.grossSales)) * 100).toFixed(3))
      : String((DEFAULT_TAX_RATE * 100).toFixed(2))
  );
  const [taxOwed, setTaxOwed] = useState(
    initial?.taxOwed != null ? String(initial.taxOwed) : ""
  );
  const [status, setStatus] = useState<NcdorFilingStatus>(initial?.status ?? "Drafted");
  const [filedDate, setFiledDate] = useState(initial?.filedDate ?? "");
  const [confirmationNumber, setConfirmationNumber] = useState(initial?.confirmationNumber ?? "");
  const [notes, setNotes] = useState(initial?.notes ?? "");
  const [taxAutoCalc, setTaxAutoCalc] = useState(!initial?.taxOwed);

  // Auto-calc taxOwed from taxableSales × rate (or grossSales × rate if taxable unset).
  function recomputeTax(g: string, t: string, r: string) {
    if (!taxAutoCalc) return;
    const gn = parseFloat(g);
    const tn = parseFloat(t);
    const rn = parseFloat(r);
    const base = Number.isFinite(tn) ? tn : Number.isFinite(gn) ? gn : NaN;
    if (Number.isFinite(base) && Number.isFinite(rn)) {
      setTaxOwed((base * (rn / 100)).toFixed(2));
    }
  }

  function submit(e: React.FormEvent) {
    e.preventDefault();
    const gross = grossSales.trim() === "" ? undefined : parseFloat(grossSales);
    const taxable = taxableSales.trim() === "" ? gross : parseFloat(taxableSales);
    const owed = taxOwed.trim() === "" ? undefined : parseFloat(taxOwed);
    onSubmit({
      entitySlug,
      periodYear,
      periodMonth,
      grossSales: gross,
      taxableSales: taxable,
      taxOwed: owed,
      status,
      filedDate: filedDate.trim() || undefined,
      confirmationNumber: confirmationNumber.trim() || undefined,
      notes: notes.trim() || undefined,
    });
  }

  // Year options: current year + 2 prior.
  const now = new Date();
  const yearOptions = [now.getUTCFullYear(), now.getUTCFullYear() - 1, now.getUTCFullYear() - 2];

  return (
    <Card>
      <CardContent className="p-6">
        <form onSubmit={submit} className="grid gap-3 md:grid-cols-3">
          <Field label="Entity" className="md:col-span-2">
            <select
              value={entitySlug}
              onChange={(e) => setEntitySlug(e.target.value)}
              className="w-full h-10 rounded-md border border-input bg-background px-3 text-sm"
              required
            >
              {entities.map((o) => (
                <option key={o.slug} value={o.slug}>
                  {o.emoji} {o.name} ({o.industry})
                </option>
              ))}
            </select>
          </Field>
          <Field label="Period">
            <div className="flex gap-2">
              <select
                value={periodMonth}
                onChange={(e) => setPeriodMonth(parseInt(e.target.value, 10))}
                className="h-10 rounded-md border border-input bg-background px-3 text-sm flex-1"
              >
                {MONTH_NAMES.map((m, i) => (
                  <option key={m} value={i + 1}>
                    {m}
                  </option>
                ))}
              </select>
              <select
                value={periodYear}
                onChange={(e) => setPeriodYear(parseInt(e.target.value, 10))}
                className="h-10 rounded-md border border-input bg-background px-3 text-sm"
              >
                {yearOptions.map((y) => (
                  <option key={y} value={y}>
                    {y}
                  </option>
                ))}
              </select>
            </div>
          </Field>

          <Field label="Gross sales">
            <Input
              type="number"
              step="0.01"
              value={grossSales}
              onChange={(e) => {
                setGrossSales(e.target.value);
                recomputeTax(e.target.value, taxableSales, taxRate);
              }}
              placeholder="0.00"
            />
          </Field>
          <Field label="Taxable sales (defaults to gross)">
            <Input
              type="number"
              step="0.01"
              value={taxableSales}
              onChange={(e) => {
                setTaxableSales(e.target.value);
                recomputeTax(grossSales, e.target.value, taxRate);
              }}
              placeholder="0.00"
            />
          </Field>
          <Field label="Combined rate %">
            <Input
              type="number"
              step="0.001"
              value={taxRate}
              onChange={(e) => {
                setTaxRate(e.target.value);
                recomputeTax(grossSales, taxableSales, e.target.value);
              }}
              placeholder="7.00"
            />
          </Field>

          <Field label="Tax owed">
            <div className="flex items-center gap-2">
              <Input
                type="number"
                step="0.01"
                value={taxOwed}
                onChange={(e) => {
                  setTaxAutoCalc(false);
                  setTaxOwed(e.target.value);
                }}
                placeholder="0.00"
              />
              {!taxAutoCalc && (
                <button
                  type="button"
                  className="text-[10px] underline text-muted-foreground"
                  onClick={() => {
                    setTaxAutoCalc(true);
                    const gn = parseFloat(grossSales);
                    const tn = parseFloat(taxableSales);
                    const rn = parseFloat(taxRate);
                    const base = Number.isFinite(tn) ? tn : Number.isFinite(gn) ? gn : NaN;
                    if (Number.isFinite(base) && Number.isFinite(rn)) {
                      setTaxOwed((base * (rn / 100)).toFixed(2));
                    }
                  }}
                >
                  auto
                </button>
              )}
            </div>
          </Field>
          <Field label="Status">
            <select
              value={status}
              onChange={(e) => setStatus(e.target.value as NcdorFilingStatus)}
              className="w-full h-10 rounded-md border border-input bg-background px-3 text-sm"
            >
              {(["Unfiled", "Drafted", "Submitted", "Paid", "Late"] as NcdorFilingStatus[]).map(
                (s) => (
                  <option key={s} value={s}>
                    {s}
                  </option>
                )
              )}
            </select>
          </Field>
          <Field label="Filed date">
            <Input
              type="date"
              value={filedDate}
              onChange={(e) => setFiledDate(e.target.value)}
            />
          </Field>
          <Field label="Confirmation #" className="md:col-span-2">
            <Input
              value={confirmationNumber}
              onChange={(e) => setConfirmationNumber(e.target.value)}
              placeholder="NCDOR portal confirmation #"
            />
          </Field>
          <Field label="Notes" className="md:col-span-3">
            <textarea
              value={notes}
              onChange={(e) => setNotes(e.target.value)}
              className="w-full rounded-md border border-input bg-background p-2 text-sm"
              rows={2}
              placeholder="Toast CSV total used; adjustments; etc."
            />
          </Field>
          <div className="md:col-span-3 flex items-center justify-end gap-2">
            <Button variant="ghost" size="sm" type="button" onClick={onCancel}>
              Cancel
            </Button>
            <Button variant="brand" size="sm" type="submit">
              {submitLabel}
            </Button>
          </div>
        </form>
      </CardContent>
    </Card>
  );
}

// ──────────────────────────────────────────────────────────────────────────
// Shared primitives
// ──────────────────────────────────────────────────────────────────────────

function Field({
  label,
  children,
  className,
}: {
  label: string;
  children: React.ReactNode;
  className?: string;
}) {
  return (
    <div className={className}>
      <label className="text-xs text-muted-foreground">{label}</label>
      <div className="mt-1">{children}</div>
    </div>
  );
}

