/**
 * Cron: Scheduled Publish — runs every minute (piggybacked on deal-expiry schedule).
 *
 * Selects page_layout_pointers rows where scheduledVersionId IS NOT NULL
 * and scheduledAt <= NOW(), then flips liveVersionId to the scheduled version
 * and clears the scheduled fields.
 */

import { createDbService } from '@/server/services/db.js';
import { and, isNotNull, lte } from 'drizzle-orm';
import { withSentry } from '@/server/observability/with-sentry';
import { pageLayoutPointers } from '../db/schema.js';
import { publishLayoutPointer } from '../db/queries/cron-boundary.js';
import type { CronEnv } from './deal-expiry.js';

export const runScheduledPublish = withSentry(
  async function runScheduledPublish(env: CronEnv): Promise<void> {
    if (!env.DATABASE_URL) return;
    const db = env.db ?? createDbService({ DATABASE_URL: env.DATABASE_URL });
    const now = new Date();

    const rows = await db
      .select()
      .from(pageLayoutPointers)
      .where(
        and(
          isNotNull(pageLayoutPointers.scheduledVersionId),
          lte(pageLayoutPointers.scheduledAt, now),
        ),
      );

    for (const ptr of rows) {
      await publishLayoutPointer(db, ptr.page, ptr.scheduledVersionId!);
    }
  },
  { name: 'cron.scheduled-publish', kind: 'cron' },
);
