import { Page } from '@playwright/test';

/**
 * Test-only API utilities for per-test data cleanup.
 *
 * These helpers call backend endpoints that are only active outside production
 * (guarded by FLASK_ENV check in the backend).
 *
 * Design notes
 * ────────────
 *  • resetShopState  — calls POST /api/shop/test-reset.  No auth required so it
 *                      can (and should) be called BEFORE login, avoiding any
 *                      risk of session-cookie side-effects.
 *
 *  • NPC chat sessions do NOT need resetting between tests because each test
 *    runs in a fresh Playwright browser context (new cookies → new scope_id).
 *    The backend keys conversations by (user_id, scope_id, character), so a new
 *    scope_id means a clean slate automatically.
 *
 *  Endpoints used
 *  ──────────────
 *   POST /api/shop/test-reset  — marks all items unsold, restores all user gold
 *                                to 500, clears all inventory entries.
 */
export class TestApiUtils {
  /**
   * Reset shop DB state: unsell items, restore gold (→ 500), clear inventory.
   *
   * Must be called BEFORE login (no auth cookie required) so that it cannot
   * accidentally modify the Flask session and corrupt subsequent auth checks.
   */
  static async resetShopState(page: Page): Promise<void> {
    const baseUrl = process.env.SUT_URL || 'http://localhost';
    const response = await page.request.post(`${baseUrl}/api/shop/test-reset`);
    if (!response.ok()) {
      console.warn(
        `[TestApiUtils] /api/shop/test-reset returned ${response.status()} — ` +
          'shop state may be dirty for this test',
      );
    }
  }

  /**
   * Full bargaining test teardown.
   * Only resets shop DB state; NPC sessions auto-isolate per browser context.
   */
  static async cleanupBargainingState(page: Page): Promise<void> {
    await TestApiUtils.resetShopState(page);
  }
}
