import { vi } from 'vitest';

const OG_ENV_KEYS = [
  'OG_MEMORY_URL',
  'OG_MEMORY_ACCOUNT_ID', 'OG_ACCOUNT_ID',
  'OG_MEMORY_USER_ID',    'OG_USER_ID',
  'OG_MEMORY_AGENT_ID',   'OG_AGENT_ID',
  'OG_AUTH_API_KEY',
] as const;

const originalEnv: Record<string, string | undefined> = {};

export function saveEnv(): void {
  for (const key of OG_ENV_KEYS) {
    originalEnv[key] = process.env[key];
  }
}

export function resetEnv(): void {
  for (const key of OG_ENV_KEYS) {
    if (originalEnv[key] === undefined) {
      delete process.env[key];
    } else {
      process.env[key] = originalEnv[key]!;
    }
  }
}

export function stubEnv(vars: Record<string, string>): void {
  for (const [key, value] of Object.entries(vars)) {
    process.env[key] = value;
  }
}

export function createMockFetch(
  response: { ok: boolean; status: number; json: () => Promise<unknown> },
): typeof fetch {
  return vi.fn().mockResolvedValue(response);
}

export function createMockOpencodeClient() {
  return {
    app: {
      log: vi.fn().mockResolvedValue({ data: true }),
    },
    session: {
      messages: vi.fn().mockResolvedValue({
        data: [],
        error: undefined,
        request: new Request('http://localhost:3000/session/s1/message'),
        response: new Response(),
      }),
    },
  };
}