import { prisma } from "@/lib/prisma";

/** Demo-access validity window: how many days a granted demo environment
 *  stays usable. The default (10 days) and the per-request override both
 *  come from the central admin. */

export const DEMO_VALID_DAYS_KEY = "demoValidDays";
export const DEFAULT_DEMO_VALID_DAYS = 10;
export const MIN_DEMO_VALID_DAYS = 1;
export const MAX_DEMO_VALID_DAYS = 365;

/** Clamp a validity value coming from an admin form/input. */
export function clampDemoValidDays(v: unknown, fallback: number): number {
  const n = Number(v);
  if (!Number.isFinite(n)) return fallback;
  return Math.min(MAX_DEMO_VALID_DAYS, Math.max(MIN_DEMO_VALID_DAYS, Math.floor(n)));
}

/** Platform-wide default the central admin configured (falls back to 10). */
export async function getDemoValidDays(): Promise<number> {
  const row = await prisma.platformSetting.findUnique({
    where: { key: DEMO_VALID_DAYS_KEY },
    select: { value: true },
  });
  return clampDemoValidDays(row?.value, DEFAULT_DEMO_VALID_DAYS);
}

export async function setDemoValidDays(days: number): Promise<number> {
  const value = String(clampDemoValidDays(days, DEFAULT_DEMO_VALID_DAYS));
  await prisma.platformSetting.upsert({
    where: { key: DEMO_VALID_DAYS_KEY },
    update: { value },
    create: { key: DEMO_VALID_DAYS_KEY, value },
  });
  return Number(value);
}

/** Expiry for a demo granted/adjusted at `from` for `validDays` days. When
 *  the natural window (grant + days) already ended, extending counts from
 *  now instead, so raising the days always re-opens access. */
export function demoExpiryFrom(from: Date, validDays: number): Date {
  const natural = new Date(from.getTime() + validDays * 24 * 60 * 60 * 1000);
  if (natural.getTime() > Date.now()) return natural;
  return new Date(Date.now() + validDays * 24 * 60 * 60 * 1000);
}
