import { Database } from "bun:sqlite";

export const COMPRESSED_DRIFT_CUTOFF_ISO = "2026-05-21T09:35:30Z";

export interface BackfillResult {
  candidates: number;
  updated: number;
  skipped: number;
}

export function backfillCompressedDrift(db: Database, opts: { dryRun?: boolean } = {}): BackfillResult {
  const dryRun = opts.dryRun ?? false;
  const candidates = db.query<{ n: number }, []>(
    `SELECT COUNT(*) AS n FROM requests
      WHERE timestamp >= '${COMPRESSED_DRIFT_CUTOFF_ISO}'
        AND compressed_input_tokens < (cache_hit_input_tokens + cache_creation_input_tokens)`
  ).get()?.n ?? 0;

  if (dryRun) return { candidates, updated: 0, skipped: candidates };

  db.run(
    `UPDATE requests
        SET compressed_input_tokens = compressed_input_tokens + cache_hit_input_tokens
      WHERE timestamp >= '${COMPRESSED_DRIFT_CUTOFF_ISO}'
        AND compressed_input_tokens < (cache_hit_input_tokens + cache_creation_input_tokens)`
  );

  const remaining = db.query<{ n: number }, []>(
    `SELECT COUNT(*) AS n FROM requests
      WHERE timestamp >= '${COMPRESSED_DRIFT_CUTOFF_ISO}'
        AND compressed_input_tokens < (cache_hit_input_tokens + cache_creation_input_tokens)`
  ).get()?.n ?? 0;

  return { candidates, updated: candidates - remaining, skipped: remaining };
}
