import { createScheduledDbService } from '@/server/services/db.js';
import { BaseDO } from './_base.js';
import type { MultidealEnv } from '../lib/env.js';
import { expireGoldWindow } from '../lifecycle/deals.js';

/**
 * GoldWindowDO — Durable Object for sold-out deal gold-window expiry alarms.
 *
 * Alarm fires at deal.soldOutGoldExpiresAt epoch ms.
 * Clears the gold shimmer for a single deal.
 */
export class GoldWindowDO extends BaseDO {
  protected className = 'GoldWindowDO';

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

  override async alarm(): Promise<void> {
    const dealId = (await this.ctx.storage.get<string>('entity_id')) ?? this.ctx.id.toString();
    console.warn(JSON.stringify({ event: 'do_alarm_start', class: 'GoldWindowDO', dealId }));
    try {
      const db = createScheduledDbService(this.env);
      await expireGoldWindow({ db }, dealId);
      await this.ctx.storage.delete('arm_at');
      console.warn(JSON.stringify({ event: 'do_alarm_done', class: 'GoldWindowDO', dealId }));
    } catch (err) {
      console.error(
        JSON.stringify({
          event: 'do_alarm_error',
          class: 'GoldWindowDO',
          dealId,
          error: err instanceof Error ? err.message : String(err),
        }),
      );
      throw err;
    }
  }
}
