/**
 * بروزرسانی زمان‌بندی‌شده نرخ دلار: GET یا POST /api/cron/currency
 * با هدر Authorization: Bearer <CRON_SECRET>
 *
 * - زمان‌بند داخلی سرور (src/instrumentation.ts) هر دقیقه این مسیر را صدا می‌زند و این‌جا بررسی می‌شود
 *   که «فاصله بروزرسانی» تنظیم‌شده در پنل گذشته باشد؛ پس عملاً هر ۱۰ تا ۳۰ دقیقه (طبق تنظیم) یک بار نرخ گرفته می‌شود
 * - می‌توانید به‌جای آن (یا علاوه بر آن) از cron سرور هم صدا بزنید؛ ?force=1 بدون توجه به فاصله
 * - بعد از تغییر قیمت‌ها، کش صفحات فروشگاه پاک می‌شود
 */
import { revalidatePath } from "next/cache";
import { safeEqual } from "@/lib/crypto";
import { getCurrencySettings, isDue, refreshRate } from "@/server/services/currency";

export const dynamic = "force-dynamic";

let running = false;

async function handle(req: Request) {
  const secret = process.env.CRON_SECRET ?? "";
  const auth = req.headers.get("authorization")?.replace(/^Bearer\s+/i, "") ?? "";
  if (secret.length < 24 || !safeEqual(auth, secret)) return Response.json({ error: "unauthorized" }, { status: 401 });

  const force = new URL(req.url).searchParams.get("force") === "1";
  if (!force && !isDue(await getCurrencySettings())) return Response.json({ skipped: "not-due" });
  if (running) return Response.json({ skipped: "running" });
  running = true;
  try {
    const result = await refreshRate();
    if (result.ok && result.repriced > 0) revalidatePath("/", "layout");
    return Response.json(result, { status: result.ok ? 200 : 502 });
  } finally {
    running = false;
  }
}

export const GET = handle;
export const POST = handle;
