import { getConfig, setConfig } from "@/lib/config";
import { DEFAULT_WATERMARK_PRESET, type WatermarkPreset } from "./watermark-preset";

const CONFIG_KEY = "bot_watermark_preset";
const CACHE_TTL_MS = 30_000;

let cachedPreset: WatermarkPreset | null = null;
let cachedAt = 0;

function clamp(value: number, min: number, max: number): number {
  return Math.min(Math.max(value, min), max);
}

function normalizePreset(input: Partial<WatermarkPreset> | null | undefined): WatermarkPreset {
  return {
    opacity: clamp(Number(input?.opacity ?? DEFAULT_WATERMARK_PRESET.opacity), 0.03, 0.4),
    offsetX: clamp(Number(input?.offsetX ?? DEFAULT_WATERMARK_PRESET.offsetX), -100, 100),
    offsetY: clamp(Number(input?.offsetY ?? DEFAULT_WATERMARK_PRESET.offsetY), -40, 40),
    stampGapX: clamp(Number(input?.stampGapX ?? DEFAULT_WATERMARK_PRESET.stampGapX), 0, 60),
    stampGapY: clamp(Number(input?.stampGapY ?? DEFAULT_WATERMARK_PRESET.stampGapY), 0, 70),
    fontFamily: typeof input?.fontFamily === "string" && input.fontFamily.trim()
      ? input.fontFamily.trim()
      : DEFAULT_WATERMARK_PRESET.fontFamily,
  };
}

export async function getSavedWatermarkPreset(forceRefresh = false): Promise<WatermarkPreset> {
  const now = Date.now();
  if (!forceRefresh && cachedPreset && now - cachedAt < CACHE_TTL_MS) {
    return cachedPreset;
  }

  const raw = await getConfig(CONFIG_KEY);
  if (!raw) {
    cachedPreset = DEFAULT_WATERMARK_PRESET;
    cachedAt = now;
    return cachedPreset;
  }

  try {
    cachedPreset = normalizePreset(JSON.parse(raw) as Partial<WatermarkPreset>);
  } catch {
    cachedPreset = DEFAULT_WATERMARK_PRESET;
  }

  cachedAt = now;
  return cachedPreset;
}

export async function saveWatermarkPreset(input: Partial<WatermarkPreset>): Promise<WatermarkPreset> {
  const normalized = normalizePreset(input);
  await setConfig(CONFIG_KEY, JSON.stringify(normalized));
  cachedPreset = normalized;
  cachedAt = Date.now();
  return normalized;
}
