import Link from "next/link";
import type { Metadata } from "next";
import { redirect } from "next/navigation";
import { getAccountSnapshot } from "@/lib/medusa/customer";
import { getOrderStatusLabel, getOrderTrackingInfo, getOrderTrackingSteps } from "@/lib/order-tracking";
import { formatEuro } from "@/lib/utils/money";
import { getResolvedSiteText } from "@/lib/site-text-server";
import { text } from "@/lib/site-text";

export const metadata: Metadata = {
  title: "Mes commandes",
  robots: { index: false, follow: false },
};

const ORDERS_PER_PAGE = 25;

type Props = {
  searchParams: Promise<{ order?: string; page?: string }>;
};

function formatDate(value?: string | Date | null) {
  if (!value) return "-";
  const date = new Date(value);
  if (Number.isNaN(date.getTime())) return "-";
  return new Intl.DateTimeFormat("fr-FR", { dateStyle: "medium" }).format(date);
}

export default async function CompteCommandesPage({ searchParams }: Props) {
  const { order, page } = await searchParams;
  const currentPage = Math.max(1, Number.parseInt(page || "1", 10) || 1);
  const offset = (currentPage - 1) * ORDERS_PER_PAGE;
  const [account, siteText] = await Promise.all([
    getAccountSnapshot({ ordersLimit: ORDERS_PER_PAGE, ordersOffset: offset }),
    getResolvedSiteText(),
  ]);
  const t = (key: string, fallback?: string) => text(siteText, key, fallback);
  const selectedOrderId = (order || "").trim();
  const totalPages = Math.max(1, Math.ceil(account.ordersCount / ORDERS_PER_PAGE));
  const safePage = Math.min(currentPage, totalPages);

  function buildOrdersPageHref(targetPage: number) {
    const params = new URLSearchParams();
    if (targetPage > 1) {
      params.set("page", String(targetPage));
    }
    if (selectedOrderId) {
      params.set("order", selectedOrderId);
    }

    const query = params.toString();
    return query ? `/compte/commandes?${query}` : "/compte/commandes";
  }

  if (!account.authenticated || !account.customer) {
    redirect("/connexion");
  }

  if (account.ordersCount > 0 && account.orders.length === 0 && currentPage > 1) {
    redirect(buildOrdersPageHref(totalPages));
  }

  return (
    <div className="space-y-6">
      <header className="rounded-[1.9rem] border border-[#ffdede] bg-[linear-gradient(135deg,#fffafa_0%,#fff0f0_55%,#ffe7e7_100%)] p-6 shadow-[0_20px_42px_rgba(49,18,18,0.1)] md:p-8">
        <p className="text-xs font-semibold uppercase tracking-[0.18em] text-[var(--accent-3)]">{t("orders.eyebrow")}</p>
        <h1 className="mt-2 font-serif text-5xl text-[var(--foreground)] md:text-6xl">{t("orders.title")}</h1>
        <p className="mt-2 text-[var(--muted)]">{account.ordersCount} {t("account.order").toLowerCase()}{account.ordersCount > 1 ? "s" : ""}</p>
      </header>

      {account.orders.length === 0 ? (
        <section className="rounded-[1.5rem] border border-[#ffe0e0] bg-white p-6 shadow-[0_14px_32px_rgba(49,18,18,0.08)]">
          <p className="text-sm text-[var(--muted)]">{t("account.ordersEmpty")}</p>
          <Link href="/boutique" className="mt-4 inline-flex rounded-xl bg-[var(--accent)] px-4 py-2 text-sm font-semibold text-white hover:bg-[var(--accent-2)]">
            {t("orders.emptyCta")}
          </Link>
        </section>
      ) : (
        <section className="space-y-3">
          {account.orders.map((order) => (
            <details
              key={order.id}
              id={`commande-${order.id}`}
              open={selectedOrderId === order.id}
              className="rounded-[1.2rem] border border-[#ffe0e0] bg-white p-4 shadow-[0_10px_24px_rgba(49,18,18,0.06)] open:border-[var(--accent)]"
            >
              <summary className="flex cursor-pointer list-none flex-wrap items-center justify-between gap-3">
                <span className="font-semibold text-[var(--foreground)]">
                  {t("account.order")} #{order.display_id || order.id?.slice(-6)}
                </span>
                <span className="text-sm text-[var(--muted)]">{formatDate(order.created_at)}</span>
                <span className="rounded-full border border-[#ffdcdc] bg-[#fff5f5] px-2.5 py-1 text-xs font-semibold text-[var(--accent-3)]">
                  {getOrderStatusLabel(order.fulfillment_status) || order.status || t("account.inProgress")}
                </span>
                <span className="text-sm font-semibold text-[var(--accent)]">{formatEuro(order.total)}</span>
              </summary>

              <div className="mt-4 grid gap-2 rounded-xl border border-[#ffe8e8] bg-[#fffafa] p-4 text-sm text-[var(--muted)]">
                <p className="flex items-center justify-between">
                  <span>{t("orders.orderId")}</span>
                  <span className="font-medium text-[var(--foreground)]">{order.id}</span>
                </p>
                <p className="flex items-center justify-between">
                  <span>{t("orders.paymentStatus")}</span>
                  <span className="font-medium text-[var(--foreground)]">{order.payment_status || "-"}</span>
                </p>
                <p className="flex items-center justify-between">
                  <span>{t("orders.fulfillmentStatus")}</span>
                  <span className="font-medium text-[var(--foreground)]">{order.fulfillment_status || "-"}</span>
                </p>
                {typeof (order as { metadata?: Record<string, unknown> | null }).metadata?.order_note === "string" &&
                String((order as { metadata?: Record<string, unknown> | null }).metadata?.order_note || "").trim() ? (
                  <div className="rounded-lg border border-[#ffe1e1] bg-white p-3">
                    <p className="text-xs font-semibold uppercase tracking-[0.12em] text-[var(--accent-3)]">Note client</p>
                    <p className="mt-2 whitespace-pre-wrap text-sm text-[var(--foreground)]">
                      {String((order as { metadata?: Record<string, unknown> | null }).metadata?.order_note || "")}
                    </p>
                  </div>
                ) : null}
                <p className="flex items-center justify-between">
                  <span>{t("account.subtotal")}</span>
                  <span className="font-medium text-[var(--foreground)]">{formatEuro(order.subtotal)}</span>
                </p>
                <p className="flex items-center justify-between">
                  <span>{t("account.shipping")}</span>
                  <span className="font-medium text-[var(--foreground)]">{formatEuro(order.shipping_total)}</span>
                </p>
                <p className="flex items-center justify-between">
                  <span>{t("account.taxes")}</span>
                  <span className="font-medium text-[var(--foreground)]">{formatEuro(order.tax_total)}</span>
                </p>
                <p className="flex items-center justify-between">
                  <span>{t("account.discount")}</span>
                  <span className="font-medium text-[var(--foreground)]">{formatEuro(order.discount_total)}</span>
                </p>
                <p className="flex items-center justify-between border-t border-[#ffe1e1] pt-2 text-base">
                  <span className="font-semibold text-[var(--foreground)]">{t("cart.total")}</span>
                  <span className="font-semibold text-[var(--foreground)]">{formatEuro(order.total)}</span>
                </p>
                <div className="pt-2">
                  <a
                    href={`/api/commandes/${encodeURIComponent(order.id)}/facture`}
                    className="inline-flex rounded-lg border border-[#ffd0d0] bg-white px-3 py-1.5 text-sm font-semibold text-[var(--accent-3)] hover:bg-[#fff3f3]"
                  >
                    {t("orders.downloadInvoice")}
                  </a>
                </div>

                {Array.isArray(order.items) && order.items.length > 0 ? (
                  <div className="mt-2 rounded-lg border border-[#ffe1e1] bg-white p-3">
                    <p className="text-xs font-semibold uppercase tracking-[0.12em] text-[var(--accent-3)]">{t("orders.itemsTitle")}</p>
                    <div className="mt-2 space-y-2">
                      {order.items.map((item) => (
                        <div key={item.id} className="flex items-center justify-between gap-3 text-sm">
                          <div>
                            <p className="font-medium text-[var(--foreground)]">{item.title || item.product_title || "Article"}</p>
                            <p className="text-[var(--muted)]">{t("orders.quantity")}: {item.quantity || 1}</p>
                          </div>
                          <p className="font-medium text-[var(--foreground)]">{formatEuro(item.total)}</p>
                        </div>
                      ))}
                    </div>
                  </div>
                ) : null}

                <div className="mt-2 rounded-lg border border-[#ffe1e1] bg-white p-3">
                  <p className="text-xs font-semibold uppercase tracking-[0.12em] text-[var(--accent-3)]">
                    Suivi de commande
                  </p>
                  <div className="mt-3 grid gap-2">
                    {getOrderTrackingSteps(order).map((step) => (
                      <div key={`${order.id}-${step.id}`} className="flex items-center justify-between gap-3 text-sm">
                        <div className="flex items-center gap-2">
                          <span
                            className={`inline-flex h-2.5 w-2.5 rounded-full ${
                              step.state === "done"
                                ? "bg-[#15a26c]"
                                : step.state === "current"
                                  ? "bg-[var(--accent)]"
                                  : "bg-[#d6d6d6]"
                            }`}
                          />
                          <span className={step.state === "todo" ? "text-[var(--muted)]" : "text-[var(--foreground)]"}>{step.label}</span>
                        </div>
                        <span className="text-[var(--muted)]">{step.date || "-"}</span>
                      </div>
                    ))}
                  </div>
                  {(() => {
                    const tracking = getOrderTrackingInfo(order);
                    if (!tracking.number && !tracking.url) {
                      return (
                        <p className="mt-3 text-xs text-[var(--muted)]">
                          Le numéro de suivi apparaîtra ici dès que votre colis sera expédié.
                        </p>
                      );
                    }

                    return (
                      <div className="mt-3 rounded-lg border border-[#ffe1e1] bg-[#fffafa] p-3">
                        {tracking.carrier ? (
                          <p className="text-xs text-[var(--muted)]">Transporteur: <span className="font-medium text-[var(--foreground)]">{tracking.carrier}</span></p>
                        ) : null}
                        {tracking.number ? (
                          <p className="mt-1 text-xs text-[var(--muted)]">Numero de suivi: <span className="font-medium text-[var(--foreground)]">{tracking.number}</span></p>
                        ) : null}
                        {tracking.url ? (
                          <a
                            href={tracking.url}
                            target="_blank"
                            rel="noreferrer"
                            className="mt-2 inline-flex rounded-lg border border-[#ffd0d0] bg-white px-3 py-1.5 text-xs font-semibold text-[var(--accent-3)] hover:bg-[#fff3f3]"
                          >
                            Ouvrir le suivi colis
                          </a>
                        ) : null}
                      </div>
                    );
                  })()}
                </div>
              </div>
            </details>
          ))}

          {account.ordersCount > ORDERS_PER_PAGE ? (
            <nav className="flex flex-wrap items-center justify-between gap-3 rounded-[1.2rem] border border-[#ffe0e0] bg-white p-4 shadow-[0_10px_24px_rgba(49,18,18,0.06)]">
              <Link
                href={buildOrdersPageHref(Math.max(1, safePage - 1))}
                aria-disabled={safePage <= 1}
                className={`inline-flex rounded-lg border px-3 py-2 text-sm font-semibold ${
                  safePage <= 1
                    ? "pointer-events-none border-[#f3dede] text-[#c8aaaa]"
                    : "border-[#ffd0d0] text-[var(--accent-3)] hover:bg-[#fff3f3]"
                }`}
              >
                Page precedente
              </Link>
              <p className="text-sm text-[var(--muted)]">
                Page {safePage} sur {totalPages}
              </p>
              <Link
                href={buildOrdersPageHref(Math.min(totalPages, safePage + 1))}
                aria-disabled={safePage >= totalPages}
                className={`inline-flex rounded-lg border px-3 py-2 text-sm font-semibold ${
                  safePage >= totalPages
                    ? "pointer-events-none border-[#f3dede] text-[#c8aaaa]"
                    : "border-[#ffd0d0] text-[var(--accent-3)] hover:bg-[#fff3f3]"
                }`}
              >
                Page suivante
              </Link>
            </nav>
          ) : null}
        </section>
      )}
    </div>
  );
}
