import { createScheduledDbService } from '@/server/services/db.js';
import { BaseDO } from './_base.js';
import type { MultidealEnv } from '../lib/env.js';
import { publishScheduledPage } from '../lifecycle/scheduled-publishes.js';

/**
 * ScheduledPublishDO — Durable Object for scheduled-publish alarms.
 *
 * Keyed by page slug via idFromName(page).
 * Alarm fires at pageLayoutPointers.scheduledAt epoch ms.
 */
export class ScheduledPublishDO extends BaseDO {
  protected className = 'ScheduledPublishDO';

  constructor(ctx: DurableObjectState, env: MultidealEnv) {
    super(ctx, env);
  }

  override async alarm(): Promise<void> {
    // DO id = idFromName(page) so toString() gives us back the page slug
    const page = (await this.ctx.storage.get<string>('entity_id')) ?? this.ctx.id.toString();
    console.warn(JSON.stringify({ event: 'do_alarm_start', class: 'ScheduledPublishDO', page }));
    try {
      const db = createScheduledDbService(this.env);
      await publishScheduledPage({ db }, page);
      await this.ctx.storage.delete('arm_at');
      console.warn(JSON.stringify({ event: 'do_alarm_done', class: 'ScheduledPublishDO', page }));
    } catch (err) {
      console.error(
        JSON.stringify({
          event: 'do_alarm_error',
          class: 'ScheduledPublishDO',
          page,
          error: err instanceof Error ? err.message : String(err),
        }),
      );
      throw err;
    }
  }
}
