import { redirect } from "next/navigation";
import { setRequestLocale } from "next-intl/server";
import { connectDB } from "@/lib/db";
import { Invoice } from "@/models/Invoice";
import { Order } from "@/models/Order";
import { getSessionClientId } from "@/lib/auth";
import { Link } from "@/i18n/navigation";
import { formatEUR } from "@/lib/orderConstants";
import { AccountPageHeader } from "@/components/account/AccountPageHeader";
import { PayOnlineButton } from "@/components/orders/PayOnlineButton";
import { getSettings } from "@/lib/settings";
import { isStripeConfigured } from "@/lib/stripe";

export const dynamic = "force-dynamic";

export default async function AccountInvoicesPage({ params }: { params: Promise<{ locale: string }> }) {
  const { locale } = await params;
  setRequestLocale(locale);
  const isEn = locale === "en";

  const clientId = await getSessionClientId();
  if (!clientId) redirect(`/${locale}/login?next=%2F${locale}%2Faccount%2Finvoices`);

  await connectDB();
  const settings = await getSettings();
  const paymentAvailable = Boolean(settings.paymentSettings?.enabled) && isStripeConfigured();
  const invoices = await Invoice.find({ clientId }).sort({ issueDate: -1 }).lean();
  const orders = await Order.find({ _id: { $in: invoices.map((i) => String(i.orderId)) } })
    .select("characterOrConcept")
    .lean();
  const orderById = new Map(orders.map((o) => [String(o._id), o]));

  const statusLabels: Record<string, string> = isEn
    ? { draft: "Draft", sent: "Sent", paid: "Paid" }
    : { draft: "Entwurf", sent: "Versendet", paid: "Bezahlt" };

  return (
    <div>
      <div className="max-w-2xl">
        <AccountPageHeader
          eyebrow={isEn ? "Invoices" : "Rechnungen"}
          title={isEn ? "My invoices" : "Meine Rechnungen"}
        />

        <div className="flex flex-col gap-3">
          {invoices.map((inv) => {
            const order = orderById.get(String(inv.orderId));
            return (
              <div
                key={String(inv._id)}
                className="flex flex-wrap items-center justify-between gap-4 rounded-xl border border-white/10 bg-[var(--rk-surface)] p-5"
              >
                <div className="min-w-0">
                  <p className="text-sm text-[var(--rk-ink)]">
                    {inv.number} {order?.characterOrConcept ? `— ${order.characterOrConcept}` : ""}
                  </p>
                  <p className="text-xs text-[var(--rk-ink-muted)] mt-1">
                    {new Date(inv.issueDate).toLocaleDateString(isEn ? "en-GB" : "de-DE")} ·{" "}
                    <span className={inv.status === "paid" ? "text-emerald-400" : "text-[var(--rk-accent)]"}>
                      {statusLabels[inv.status]}
                    </span>
                  </p>
                </div>
                <div className="flex flex-wrap items-center gap-3 shrink-0">
                  <span className="text-sm">{formatEUR(inv.totalAmount)}</span>
                  {paymentAvailable && inv.status !== "paid" && inv.orderId && (
                    <PayOnlineButton orderId={String(inv.orderId)} variant="compact" />
                  )}
                  <a
                    href={`/api/invoices/${inv._id}/pdf`}
                    target="_blank"
                    rel="noopener noreferrer"
                    className="text-xs border border-white/30 rounded-lg px-3 py-1.5 hover:border-white transition-colors"
                  >
                    PDF
                  </a>
                  {order && (
                    <Link
                      href={`/account/orders/${inv.orderId}`}
                      className="text-xs text-[var(--rk-ink-muted)] hover:text-[var(--rk-ink)] underline"
                    >
                      {isEn ? "Order" : "Auftrag"}
                    </Link>
                  )}
                </div>
              </div>
            );
          })}
          {invoices.length === 0 && (
            <p className="text-sm text-center text-[var(--rk-ink-muted)]">
              {isEn ? "No invoices yet." : "Noch keine Rechnungen."}
            </p>
          )}
        </div>
      </div>
    </div>
  );
}
