import { eq, sql } from 'drizzle-orm';
import { cronCursors } from '@/server/db/schema.js';
import type { DrizzleClient } from '@/server/db/client.js';

export async function getCursor(db: DrizzleClient, jobKey: string, fallback: Date): Promise<Date> {
  const [row] = await db.select().from(cronCursors).where(eq(cronCursors.jobKey, jobKey)).limit(1);
  return row?.lastProcessedAt ?? fallback;
}

/** Monotonic high-water mark — GREATEST keeps it from ever moving backwards. */
export async function advanceCursor(db: DrizzleClient, jobKey: string, to: Date): Promise<void> {
  await db
    .insert(cronCursors)
    .values({ jobKey, lastProcessedAt: to, updatedAt: new Date() })
    .onConflictDoUpdate({
      target: cronCursors.jobKey,
      set: {
        lastProcessedAt: sql`GREATEST(${cronCursors.lastProcessedAt}, ${to})`,
        updatedAt: new Date(),
      },
    });
}
