/** نرخ دلار و قیمت‌گذاری دلاری محصولات دسته «اورجینال» */
import Link from "next/link";
import { AdminHeader, Card, Pill } from "@/components/admin/ui";
import { CurrencySettingsForm } from "@/components/admin/CurrencySettingsForm";
import { db } from "@/lib/db";
import { faNumber, formatToman } from "@/lib/format";
import { requireStaffPage } from "@/server/admin/guard";
import { effectiveRate, getCurrencySettings, isDue, originalCategoryIds } from "@/server/services/currency";

export const metadata = { title: "نرخ دلار" };
export const dynamic = "force-dynamic";

const dateTime = new Intl.DateTimeFormat("fa-IR-u-ca-persian", { dateStyle: "medium", timeStyle: "short", timeZone: "Asia/Tehran" });
function ago(iso?: string) {
  if (!iso) return "";
  const min = Math.round((Date.now() - Date.parse(iso)) / 60_000);
  return min < 1 ? "همین الان" : min < 60 ? `${faNumber(min)} دقیقه پیش` : `${faNumber(Math.round(min / 60))} ساعت پیش`;
}

export default async function CurrencyPage() {
  await requireStaffPage("/admin/currency", "currency");
  const s = await getCurrencySettings();
  const cats = await originalCategoryIds();
  const [products, priced] = await Promise.all([
    db.product.count({ where: { categoryId: { in: cats } } }),
    db.productVariant.count({ where: { product: { categoryId: { in: cats } }, priceUsdCents: { not: null } } }),
  ]);
  const rate = effectiveRate(s);
  const schedulerOn = (process.env.CRON_SECRET ?? "").length >= 24 && process.env.CURRENCY_SCHEDULER !== "off";

  return (
    <>
      <AdminHeader title="نرخ دلار" description="قیمت محصولات دسته «اورجینال» به دلار وارد می‌شود و با نرخ روز، به تومان به مشتری نمایش داده می‌شود" />
      <div className="mb-4 grid gap-3 md:grid-cols-3">
        <Card title="نرخ دلار آزاد (TGJU)">
          <p className="text-2xl font-extrabold">{s.rateToman ? formatToman(s.rateToman) : "هنوز دریافت نشده"}</p>
          <p className="mt-1 text-xs text-muted">
            {s.fetchedAt ? `آخرین بروزرسانی: ${dateTime.format(new Date(s.fetchedAt))} (${ago(s.fetchedAt)})` : "—"}
            {s.source && ` · منبع: ${s.source === "tgju-json" ? "JSON سایت TGJU" : "صفحه دلار TGJU"}`}
          </p>
        </Card>
        <Card title="نرخ مبنای قیمت‌ها">
          <p className="text-2xl font-extrabold">{rate ? formatToman(Math.round(rate)) : "—"}</p>
          <p className="mt-1 flex flex-wrap gap-1 text-xs text-muted">
            {s.useManual ? <Pill tone="ink">نرخ دستی</Pill> : <Pill>نرخ خودکار</Pill>}
            {s.marginPercent > 0 && <Pill>+٪{faNumber(s.marginPercent)} حاشیه سود</Pill>}
          </p>
        </Card>
        <Card title="محصولات دلاری">
          <p className="text-2xl font-extrabold">{faNumber(priced)} <span className="text-sm font-normal text-muted">تنوع</span></p>
          <p className="mt-1 text-xs text-muted">در {faNumber(products)} محصول دسته «اورجینال» · <Link href="/admin/products" className="underline">محصولات</Link></p>
        </Card>
      </div>

      {s.lastError && (
        <p className="mb-4 rounded-xl bg-paper px-4 py-3 text-sm ring-1 ring-ink" role="alert">
          ⚠ آخرین تلاش دریافت نرخ ناموفق بود ({s.lastErrorAt ? ago(s.lastErrorAt) : ""}): {s.lastError}
          <br />
          <span className="text-xs text-muted">قیمت‌ها با آخرین نرخ سالم محاسبه می‌شوند.</span>
        </p>
      )}

      <CurrencySettingsForm
        initial={{ useManual: s.useManual, manualRate: s.manualRate ?? null, intervalMinutes: s.intervalMinutes, marginPercent: s.marginPercent, roundTo: s.roundTo, roundMode: s.roundMode }}
        baseRate={s.rateToman ?? null}
        jumpBlocked={!!s.lastError?.includes("۲۰٪")}
      />

      <p className="mt-6 rounded-2xl bg-paper p-4 text-xs leading-6 text-muted">
        بروزرسانی خودکار: {schedulerOn ? `فعال، هر ${faNumber(s.intervalMinutes)} دقیقه${isDue(s) ? " (نوبت بعدی: به‌زودی)" : ""}` : "خاموش؛ CRON_SECRET را در .env سرور تنظیم کنید (راهنما در README)"}.
        اگر نرخ دریافتی صفر، غیرمنطقی یا بیش از ۲۰٪ متفاوت با نرخ قبلی باشد، پذیرفته نمی‌شود و آخرین نرخ سالم می‌ماند. قیمت سفارش‌های ثبت‌شده با تغییر نرخ عوض نمی‌شود.
      </p>
    </>
  );
}
