import { getTranslations, setRequestLocale } from "next-intl/server";
import { notFound } from "next/navigation";
import { Link } from "@/i18n/navigation";
import { escrowPartyAction } from "@/app/escrow-actions";
import { EscrowChat } from "@/components/escrow-chat";
import {
  ESCROW_STATUS,
  canAccessDeal,
  getEscrowDeal,
  getEscrowSettings,
  type EscrowStatus,
} from "@/lib/escrow";
import { requireUser } from "@/lib/session";

function statusKey(status: EscrowStatus) {
  return `status_${status}` as const;
}

export default async function EscrowDealPage({
  params,
  searchParams,
}: {
  params: Promise<{ locale: string; id: string }>;
  searchParams: Promise<{ error?: string }>;
}) {
  const { locale, id } = await params;
  const query = await searchParams;
  setRequestLocale(locale);
  const session = await requireUser();
  const deal = await getEscrowDeal(id);
  if (!deal || !canAccessDeal(deal, session.user.id, session.user.role === "ADMIN")) notFound();
  const settings = await getEscrowSettings();
  const t = await getTranslations("escrow");
  const isBuyer = deal.buyerId === session.user.id;
  const isSeller = deal.sellerId === session.user.id;
  const isOther = deal.creatorId !== session.user.id;

  return (
    <div className="space-y-6">
      <div>
        <p className="text-sm text-muted" dir="ltr">
          {deal.code}
        </p>
        <h1 className="page-title">{deal.title}</h1>
        <p className="mt-2 font-medium">{t(statusKey(deal.status))}</p>
        {query.error ? <p className="mt-2 text-sm text-red-700">{t("errGeneric")}</p> : null}
      </div>
      <section className="card space-y-3 p-5 text-sm">
        <p className="whitespace-pre-wrap leading-7">{deal.details}</p>
        <p>
          {t("buyer")}: {deal.buyerName}
        </p>
        <p>
          {t("seller")}: {deal.sellerName}
        </p>
        <p dir="ltr">
          {t("amount")}: {deal.amountUsdt} USDT · {t("fee")}: {deal.feeUsdt} USDT · {t("sellerGets")}:{" "}
          {deal.sellerUsdt} USDT ({deal.network})
        </p>
        {deal.sellerWallet ? (
          <p dir="ltr">
            {t("sellerWallet")}: {deal.sellerWallet}
          </p>
        ) : null}
      </section>

      {(deal.status === ESCROW_STATUS.WAITING_PAYMENT ||
        deal.status === ESCROW_STATUS.PAYMENT_SENT) &&
      settings.wallet ? (
        <section className="card space-y-2 p-5">
          <h2 className="font-semibold">{t("payNow")}</h2>
          <p className="text-sm text-muted">{t("payHint")}</p>
          <p className="break-all rounded-xl bg-background p-3 text-sm" dir="ltr">
            {settings.network}: {settings.wallet}
          </p>
          <p dir="ltr" className="text-sm font-medium">
            {deal.amountUsdt} USDT
          </p>
        </section>
      ) : null}

      {deal.status === ESCROW_STATUS.FUNDS_HELD && isSeller ? (
        <p className="rounded-2xl bg-brand/10 p-4 text-sm">{t("sellerSendNow")}</p>
      ) : null}
      {deal.status === ESCROW_STATUS.FUNDS_HELD && isBuyer ? (
        <p className="rounded-2xl bg-brand/10 p-4 text-sm">{t("buyerWaitItem")}</p>
      ) : null}

      <div className="space-y-3">
        {deal.status === ESCROW_STATUS.PENDING_ACCEPT && isOther ? (
          <form action={escrowPartyAction} className="card space-y-3 p-5">
            <input type="hidden" name="id" value={deal.id} />
            <input type="hidden" name="intent" value="accept" />
            {isSeller && !deal.sellerWallet ? (
              <label className="block text-sm">
                {t("sellerWallet")}
                <input
                  name="sellerWallet"
                  required
                  className="mt-1 w-full rounded-xl border border-line px-3 py-2"
                  dir="ltr"
                />
              </label>
            ) : null}
            <button className="btn-primary">{t("accept")}</button>
          </form>
        ) : null}

        {isBuyer &&
        (deal.status === ESCROW_STATUS.WAITING_PAYMENT ||
          deal.status === ESCROW_STATUS.PAYMENT_SENT) ? (
          <form action={escrowPartyAction} className="card flex flex-wrap items-end gap-3 p-5">
            <input type="hidden" name="id" value={deal.id} />
            <input type="hidden" name="intent" value="paid" />
            <label className="text-sm">
              {t("txHash")}
              <input
                name="buyerTx"
                defaultValue={deal.buyerTx ?? ""}
                className="mt-1 block rounded-xl border border-line px-3 py-2"
                dir="ltr"
              />
            </label>
            <button className="btn-primary">{t("iPaid")}</button>
          </form>
        ) : null}

        {isSeller && deal.status === ESCROW_STATUS.FUNDS_HELD ? (
          <form action={escrowPartyAction}>
            <input type="hidden" name="id" value={deal.id} />
            <input type="hidden" name="intent" value="sent" />
            <button className="btn-primary">{t("iSent")}</button>
          </form>
        ) : null}

        {isBuyer && deal.status === ESCROW_STATUS.ITEM_SENT ? (
          <form action={escrowPartyAction}>
            <input type="hidden" name="id" value={deal.id} />
            <input type="hidden" name="intent" value="received" />
            <button className="btn-primary">{t("iReceived")}</button>
          </form>
        ) : null}

        {deal.status !== ESCROW_STATUS.COMPLETED && deal.status !== ESCROW_STATUS.CANCELLED ? (
          <form action={escrowPartyAction}>
            <input type="hidden" name="id" value={deal.id} />
            <input type="hidden" name="intent" value="cancel" />
            <button className="text-sm text-red-700">{t("cancel")}</button>
          </form>
        ) : null}
      </div>
      <EscrowChat dealId={deal.id} viewerId={session.user.id} />
      <Link href="/dashboard/escrow" className="text-brand">
        {t("back")}
      </Link>
    </div>
  );
}
