import { describe, expect, test } from 'vitest';

import type { AgentRuntime } from '../../src/runtime/agent-runtime';
import type { Claim } from '../../src/runtime/provider';
import { getAdapter, registerAdapter } from '../../src/runtime/agent-runtime';
import { isCodexLoginProfile, opencodeModel } from '../../src/runtime/provider';

describe('agent runtime registry', () => {
  test('registerAdapter/getAdapter resolves a registered runtime', () => {
    const fake: AgentRuntime = {
      name: 'codex',
      prepareAuth: () => Promise.resolve(),
      runTurn: () => Promise.resolve({}),
      abort: () => Promise.resolve(),
    };
    registerAdapter('codex', () => fake);
    expect(getAdapter('codex').name).toBe('codex');
  });

  test('getAdapter throws for an unregistered runtime', () => {
    expect(() => getAdapter('opencode')).toThrow(/No agent runtime adapter/);
  });
});

describe('shared provider helpers re-exported from runtime/provider', () => {
  test('isCodexLoginProfile detects opencode login profiles', () => {
    expect(
      isCodexLoginProfile({
        aiProviderProfile: { provider: 'opencode_openai_login' },
      } as Claim),
    ).toBe(true);
    expect(isCodexLoginProfile({} as Claim)).toBe(false);
  });

  test('opencodeModel prefixes the provider', () => {
    expect(
      opencodeModel({
        aiProviderProfile: { provider: 'anthropic', model: 'claude-x' },
      } as Claim),
    ).toBe('anthropic/claude-x');
  });
});
