import { notFound } from "next/navigation";
import Link from "next/link";
import { eq } from "drizzle-orm";
import { db, schema } from "@/lib/db";
import type { InvoiceClientInfo, InvoiceLineItem } from "@/lib/db/schema";
import Icon from "@/components/Icon";
import EditInvoiceForm from "./EditInvoiceForm";
import { formatEurFromCents, isLineItemArray } from "@/lib/invoices";

export const metadata = { title: "Modifier la facture" };

function toDateInput(d: Date | null | undefined): string {
  if (!d) return "";
  const date = new Date(d);
  if (Number.isNaN(date.getTime())) return "";
  return date.toISOString().slice(0, 10);
}

export default async function FactureEditPage({
  params,
}: {
  params: Promise<{ id: string }>;
}) {
  const { id } = await params;

  const inv = (
    await db
      .select()
      .from(schema.invoice)
      .where(eq(schema.invoice.id, id))
      .limit(1)
  )[0];
  if (!inv) notFound();

  const client = inv.clientId
    ? (
        await db
          .select()
          .from(schema.user)
          .where(eq(schema.user.id, inv.clientId))
          .limit(1)
      )[0]
    : null;

  const dossier = inv.dossierId
    ? (
        await db
          .select()
          .from(schema.dossier)
          .where(eq(schema.dossier.id, inv.dossierId))
          .limit(1)
      )[0]
    : null;

  const lineItems: InvoiceLineItem[] = isLineItemArray(inv.lineItems)
    ? inv.lineItems
    : [];
  const clientInfo = inv.clientInfo as InvoiceClientInfo | null;
  const clientLabel = client
    ? `${client.name} · ${client.email}`
    : clientInfo?.name
      ? `${clientInfo.name}${clientInfo.email ? ` · ${clientInfo.email}` : ""}`
      : "Client supprimé";

  return (
    <div className="space-y-10 max-w-4xl">
      <Link
        href="/socialexadmin/factures"
        className="inline-flex items-center gap-2 text-xs uppercase tracking-widest text-on-surface-variant hover:text-primary transition-colors font-serif"
      >
        <Icon name="arrow_back" className="!text-base" />
        Retour aux factures
      </Link>

      {inv.isManual && lineItems.length > 0 && (
        <section className="bg-surface-container-low border border-outline-variant p-6 space-y-4">
          <header>
            <span className="eyebrow">Facture manuelle</span>
            <h2 className="font-serif text-lg text-primary mt-1">
              Lignes de facturation
            </h2>
            <p className="text-xs text-on-surface-variant mt-2">
              Aperçu en lecture seule. Pour modifier les lignes ou la TVA,
              supprimez puis recréez la facture.
            </p>
          </header>
          <table className="w-full text-sm">
            <thead>
              <tr className="border-b border-outline-variant/60 text-left">
                <th className="eyebrow !text-on-surface-variant pb-2">
                  Description
                </th>
                <th className="eyebrow !text-on-surface-variant pb-2 text-right w-20">
                  Qté
                </th>
                <th className="eyebrow !text-on-surface-variant pb-2 text-right w-28">
                  Prix HT
                </th>
                <th className="eyebrow !text-on-surface-variant pb-2 text-right w-28">
                  Total HT
                </th>
              </tr>
            </thead>
            <tbody>
              {lineItems.map((li, idx) => (
                <tr
                  key={idx}
                  className="border-b border-outline-variant/30 last:border-b-0"
                >
                  <td className="py-2 pr-4">{li.description}</td>
                  <td className="py-2 text-right font-mono">{li.quantity}</td>
                  <td className="py-2 text-right font-mono">
                    {formatEurFromCents(li.unitPriceHtCents)}
                  </td>
                  <td className="py-2 text-right font-mono">
                    {formatEurFromCents(li.quantity * li.unitPriceHtCents)}
                  </td>
                </tr>
              ))}
            </tbody>
          </table>
          {inv.vatRateBps != null && (
            <p className="text-xs text-on-surface-variant">
              TVA appliquée : {(inv.vatRateBps / 100).toString().replace(".", ",")}%
            </p>
          )}
        </section>
      )}

      <EditInvoiceForm
        invoiceId={inv.id}
        initial={{
          number: inv.number,
          description: inv.description,
          amountEur: inv.amountCents / 100,
          status: inv.status as
            | "brouillon"
            | "envoyee"
            | "payee"
            | "annulee",
          paymentMethod: inv.paymentMethod ?? "",
          paymentReference: inv.paymentReference ?? "",
          issuedAt: toDateInput(inv.issuedAt),
          dueAt: toDateInput(inv.dueAt),
          paidAt: toDateInput(inv.paidAt),
          clientLabel,
          dossierReference: dossier?.reference ?? null,
          dossierId: dossier?.id ?? null,
        }}
      />
    </div>
  );
}
