import { getTranslations, setRequestLocale } from "next-intl/server";
import { redirect } from "next/navigation";
import { getSessionClientId } from "@/lib/auth";
import { connectDB } from "@/lib/db";
import { Order } from "@/models/Order";
import { getSettings } from "@/lib/settings";
import { NewOrderForm } from "@/components/orders/NewOrderForm";
import { ProcessSteps } from "@/components/orders/ProcessSteps";
import { AccountPageHeader } from "@/components/account/AccountPageHeader";

export async function generateMetadata({ params }: { params: Promise<{ locale: string }> }) {
  const { locale } = await params;
  const t = await getTranslations({ locale, namespace: "orders" });
  return { title: t("newOrderTitle") };
}

export default async function NewOrderPage({
  params,
  searchParams,
}: {
  params: Promise<{ locale: string }>;
  searchParams: Promise<{
    shootingType?: string;
    concept?: string;
    serviceId?: string;
    tierId?: string;
    bundleId?: string;
    fromOrderId?: string;
  }>;
}) {
  const { locale } = await params;
  const { shootingType, concept, serviceId, tierId, bundleId, fromOrderId } = await searchParams;
  setRequestLocale(locale);
  const t = await getTranslations({ locale, namespace: "orders" });

  const clientId = await getSessionClientId();
  if (!clientId) {
    const qs = new URLSearchParams();
    if (shootingType) qs.set("shootingType", shootingType);
    if (concept) qs.set("concept", concept);
    if (serviceId) qs.set("serviceId", serviceId);
    if (tierId) qs.set("tierId", tierId);
    if (bundleId) qs.set("bundleId", bundleId);
    if (fromOrderId) qs.set("fromOrderId", fromOrderId);
    const query = qs.toString();
    const next = `/${locale}/account/new-order${query ? `?${query}` : ""}`;
    redirect(`/${locale}/login?next=${encodeURIComponent(next)}`);
  }

  // Vorbefüllung aus einem alten Auftrag ("Nochmal buchen") — Auftrag muss
  // dem eingeloggten Kunden gehören, sonst wird er einfach ignoriert statt
  // einen Fehler zu werfen (kein sensibler Vorgang, nur Komfort-Feature).
  let fromOrder: import("@/models/Order").OrderDoc | null = null;
  if (fromOrderId) {
    await connectDB();
    const candidate = await Order.findById(fromOrderId).lean();
    if (candidate && String(candidate.clientId) === clientId) fromOrder = candidate;
  }

  const settings = await getSettings();

  return (
    <div>
      <div className="max-w-xl">
        <AccountPageHeader
          title={t("newOrderTitle")}
          subtitle={fromOrder ? t("newOrderSubtitleAgain") : t("newOrderSubtitle")}
        />
        <ProcessSteps locale={locale} />
        <div>
          <NewOrderForm
            locale={locale}
            minLeadTimeWeeks={settings.bookingSettings.minLeadTimeWeeks}
            defaultShootingType={shootingType ?? fromOrder?.shootingType}
            defaultConcept={concept ?? fromOrder?.characterOrConcept}
            serviceId={serviceId}
            tierId={tierId}
            bundleId={bundleId}
            defaultEventLocation={fromOrder?.eventLocation}
            defaultDatePeriod={fromOrder?.datePeriod}
            defaultInstagramHandle={fromOrder?.instagramHandle}
            defaultDiscordHandle={fromOrder?.discordHandle}
            defaultIdeaMood={fromOrder?.ideaMood}
            defaultAdditionalNotes={fromOrder?.additionalNotes}
          />
        </div>
      </div>
    </div>
  );
}
