/**
 * PostgreSQL-backed WikiCheckpointStore implementation.
 */

import type { WikiCheckpointStore, CachedStepResult } from "@optage/sdk";
import { getDb } from "./db";

export class PgWikiCheckpointStore implements WikiCheckpointStore {
  constructor(private repositoryId: string) {}

  async get(stepKey: string): Promise<CachedStepResult | null> {
    const db = await getDb();
    const res = await db.query(
      `SELECT pages, supplemental_nav, warning FROM wiki_page_cache
       WHERE repository_id = $1 AND step_key = $2`,
      [this.repositoryId, stepKey],
    );
    if (res.rows.length === 0) return null;
    const row = res.rows[0];
    return {
      pages: row.pages,
      supplementalNav: row.supplemental_nav ?? undefined,
      warning: row.warning ?? null,
    };
  }

  async set(stepKey: string, stepType: string, result: CachedStepResult): Promise<void> {
    const db = await getDb();
    await db.query(
      `INSERT INTO wiki_page_cache (repository_id, step_key, step_type, pages, supplemental_nav, warning)
       VALUES ($1, $2, $3, $4, $5, $6)
       ON CONFLICT (repository_id, step_key)
       DO UPDATE SET pages = $4, supplemental_nav = $5, warning = $6, created_at = NOW()`,
      [
        this.repositoryId,
        stepKey,
        stepType,
        JSON.stringify(result.pages),
        result.supplementalNav ? JSON.stringify(result.supplementalNav) : null,
        result.warning,
      ],
    );
  }

  async clear(): Promise<void> {
    const db = await getDb();
    await db.query(
      `DELETE FROM wiki_page_cache WHERE repository_id = $1`,
      [this.repositoryId],
    );
  }
}
