import { getTranslations, setRequestLocale } from "next-intl/server";
import { redirect } from "next/navigation";
import { connectDB } from "@/lib/db";
import { Client } from "@/models/Client";
import { Order } from "@/models/Order";
import { Contract } from "@/models/Contract";
import { DiscountCode } from "@/models/DiscountCode";
import { getSessionClientId } from "@/lib/auth";
import { getOrCreateReferralCode } from "@/lib/referrals";
import { getSettings } from "@/lib/settings";
import { Link } from "@/i18n/navigation";
import { ORDER_TAG_COLORS, formatEUR, formatDatePeriod, type OrderTag } from "@/lib/orderConstants";
import { ReferralCodeCard } from "@/components/account/ReferralCodeCard";
import { SalutationPrompt } from "@/components/account/SalutationPrompt";
import { QuickTipsModal, type QuickTip } from "@/components/account/QuickTipsModal";

const STAFF_TIPS: QuickTip[] = [
  {
    title: "Ein-/Ausstempeln",
    description:
      "Deine Arbeitszeit erfasst du unter Konto → Mitarbeiter. Bitte auch für Pausen kurz aus- und wieder einstempeln, sonst wertet das System eine Pause fälschlich als durchgehende Arbeitszeit.",
  },
  {
    title: "Urlaub beantragen",
    description:
      "Im selben Bereich (Mitarbeiter) beantragst du Urlaub, siehst dein Jahres-Kontingent und den Status deiner Anträge — HR genehmigt oder lehnt ab.",
  },
  {
    title: "Gehalt & sensible Daten",
    description:
      "Dort findest du außerdem deine Gehaltsübersicht inkl. Erhöhungs-Historie und trägst Bankverbindung, SV-Nr. und Steuer-ID selbst ein — verschlüsselt gespeichert, nur für dich und berechtigtes HR-Personal einsehbar.",
  },
  {
    title: "Mitarbeiterhandbuch",
    description:
      "Im Admin-Bereich unter Intranet → Abläufe findest du das Mitarbeiterhandbuch mit den wichtigsten Infos zu Zeiterfassung, Urlaub, Gehalt und mehr.",
  },
];

const CLIENT_TIPS: QuickTip[] = [
  {
    title: "Deine Aufträge im Blick",
    description: "Unter „Aufträge\" siehst du den Status jedes Shootings, von der Anfrage bis zur Fotofreigabe.",
  },
  {
    title: "Verträge & Rechnungen",
    description: "Digitale Verträge unterschreibst du direkt im jeweiligen Auftrag, Rechnungen findest du gesammelt unter „Rechnungen\".",
  },
  {
    title: "Fotos ansehen",
    description: "Fertige Fotos landen unter „Fotos\" — dort triffst du deine Auswahl bzw. lädst die fertigen Bilder herunter.",
  },
  {
    title: "Profil & Gutscheine",
    description: "Unter „Profil\" pflegst du deine Kontaktdaten, unter „Gutscheine\" siehst du eingelöste und noch offene Gutscheine.",
  },
];

export const dynamic = "force-dynamic";

export default async function AccountPage({ params }: { params: Promise<{ locale: string }> }) {
  const { locale } = await params;
  setRequestLocale(locale);
  const t = await getTranslations({ locale, namespace: "auth" });
  const to = await getTranslations({ locale, namespace: "orders" });
  const tr = await getTranslations({ locale, namespace: "referrals" });

  const clientId = await getSessionClientId();
  if (!clientId) redirect(`/${locale}/login`);

  await connectDB();
  // Dashboard zeigt nur, was noch läuft: aktive Aufträge + abgeschlossene noch
  // 2 Wochen lang (Kulanzfenster), danach nur noch in /account/orders.
  const DONE_TAGS: OrderTag[] = ["done_phase1", "done_posted", "done_dropped"];
  const graceStart = new Date(Date.now() - 14 * 24 * 60 * 60 * 1000);
  const [client, orders] = await Promise.all([
    Client.findById(clientId).lean(),
    Order.find({
      clientId,
      archived: { $ne: true },
      $or: [{ tag: { $nin: DONE_TAGS } }, { doneAt: { $gte: graceStart } }],
    })
      .sort({ createdAt: -1 })
      .lean(),
  ]);
  if (!client) redirect(`/${locale}/login`);

  const unsignedOrderIds = new Set(
    (await Contract.find({ orderId: { $in: orders.map((o) => o._id) }, status: "sent" }).select("orderId").lean()).map((c) =>
      String(c.orderId)
    )
  );

  const settings = await getSettings();
  const referralCode = settings.referralSettings?.enabled ? await getOrCreateReferralCode(clientId) : "";
  const rewardCodes = referralCode
    ? await DiscountCode.find({ ownerId: clientId, active: true }).sort({ createdAt: -1 }).lean()
    : [];
  const usableRewardCodes = rewardCodes.filter((r) => r.maxUses === null || r.usedCount < r.maxUses);
  const name = client.nickname || client.firstName || client.name;

  return (
    <div>
      <p className="text-xs uppercase tracking-[0.3em] text-[var(--rk-ink-muted)]">{t("accountEyebrow")}</p>
      <h1 className="rk-wordmark mt-2 text-2xl sm:text-3xl">{t("welcome", { name })}</h1>
      <div className="rk-accent-rule" />

      {!client.onboardingTipsSeenAt && (
        <QuickTipsModal tips={client.role === "staff" ? STAFF_TIPS : CLIENT_TIPS} />
      )}

      {client.role === "client" && !client.salutation && !client.salutationPromptDismissedAt && (
        <div className="mt-6">
          <SalutationPrompt />
        </div>
      )}

      {(client.creditBalance || 0) !== 0 && (
        <p className="mt-4 text-sm text-[var(--rk-ink-muted)]">
          {tr("creditBalance", { amount: formatEUR(client.creditBalance || 0) })}
        </p>
      )}

      <Link
        href="/account/new-order"
        className="mt-6 inline-block rounded-lg bg-[var(--rk-accent)] px-6 py-3 text-xs font-semibold uppercase tracking-[0.18em] text-[#141413] transition-opacity hover:opacity-90"
      >
        {to("createOrder")}
      </Link>

      <section className="mt-12">
        <div className="flex flex-wrap items-baseline justify-between gap-2">
          <h2 className="text-xs uppercase tracking-[0.25em] text-[var(--rk-ink-muted)]">{to("activeOrders")}</h2>
          <Link
            href="/account/orders"
            className="text-xs text-[var(--rk-ink-muted)] underline underline-offset-4 transition-colors hover:text-[var(--rk-ink)]"
          >
            {to("allOrdersLink")} →
          </Link>
        </div>
        {orders.length === 0 ? (
          <p className="mt-4 text-sm text-[var(--rk-ink-muted)]">{to("noOrders")}</p>
        ) : (
          <ul className="mt-4 flex flex-col gap-3">
            {orders.map((order) => (
              <li key={String(order._id)}>
                <Link
                  href={`/account/orders/${order._id}`}
                  className="block rounded-xl border border-white/10 bg-[var(--rk-surface)] px-5 py-4 transition-colors hover:border-white/25"
                >
                  <div className="flex flex-wrap items-center justify-between gap-3">
                    <p className="text-sm font-medium">{order.characterOrConcept}</p>
                    <div className="flex items-center gap-2">
                      {unsignedOrderIds.has(String(order._id)) && (
                        <span className="rounded-full border border-amber-400/40 text-amber-400 px-2.5 py-1 text-[0.65rem] uppercase tracking-[0.1em]">
                          {to("contractAwaitingSignature")}
                        </span>
                      )}
                      <span
                        className="rounded-full border px-2.5 py-1 text-[0.65rem] uppercase tracking-[0.1em]"
                        style={{
                          borderColor: `${ORDER_TAG_COLORS[order.tag as OrderTag]}66`,
                          color: ORDER_TAG_COLORS[order.tag as OrderTag],
                        }}
                      >
                        {to(`orderTags.${order.tag}`)}
                      </span>
                    </div>
                  </div>
                  <p className="mt-1.5 text-xs text-[var(--rk-ink-muted)]">
                    {to(`shootingTypes.${order.shootingType}`)}
                    {order.eventLocation ? ` · ${order.eventLocation}` : ""}
                    {order.datePeriod
                      ? ` · ${formatDatePeriod(order.datePeriod, locale === "en" ? "en" : "de")}`
                      : ""}
                  </p>
                </Link>
              </li>
            ))}
          </ul>
        )}
      </section>

      {referralCode && (
        <div className="mt-12">
          <ReferralCodeCard
            code={referralCode}
            rewardCodes={usableRewardCodes.map((r) => ({
              code: r.code,
              label: r.type === "percent" ? `${r.value}%` : formatEUR(r.value),
            }))}
            title={tr("title")}
            intro={tr("intro")}
            copyLabel={tr("copy")}
            copiedLabel={tr("copied")}
            rewardsTitle={tr("rewardsTitle")}
          />
        </div>
      )}
    </div>
  );
}
