import { describe, it, expect, vi, beforeAll, beforeEach } from 'vitest';
import {
  afterTurn, sentCountMap,
} from '../src/index.js';
import { saveEnv, resetEnv, stubEnv, createMockFetch, createMockOpencodeClient } from './helpers.js';
import { setOpencodeClient } from '../src/index.js';

beforeAll(() => saveEnv());

describe('TestSessionCompacting', () => {
  beforeEach(() => {
    resetEnv();
    sentCountMap.clear();
    vi.restoreAllMocks();
  });

  it('skips when no opencodeClient', async () => {
    setOpencodeClient(null);
    vi.spyOn(console, 'error').mockImplementation(() => {});
    await afterTurn('', 'PreCompact');
  });

  it('calls afterTurn with PreCompact hook event', async () => {
    stubEnv({ OG_MEMORY_URL: 'http://localhost:8090' });
    const mockClient = createMockOpencodeClient();
    mockClient.session.messages.mockResolvedValue({
      data: [{ info: { role: 'user', id: 'm1' }, parts: [{ type: 'text', text: 'hello', id: 'p1' }] }],
      error: undefined,
    });
    setOpencodeClient(mockClient as any);
    const mockFetch = vi.fn().mockResolvedValue({
      ok: true, status: 200,
      json: () => Promise.resolve({ ok: true }),
    });
    vi.stubGlobal('fetch', mockFetch);

    await afterTurn('sess-1', 'PreCompact');
    expect(fetch).toHaveBeenCalled();
    const callArgs = mockFetch.mock.calls[0]!;
    const body = JSON.parse(callArgs[1].body as string);
    expect(body.hook_event_name).toBe('PreCompact');
  });
});