import { describe, it, expect, beforeAll, beforeEach } from 'vitest';
import {
  getApiBaseUrl, getIdentity, getApiKey, buildHeaders, baseCtx,
} from '../src/index.js';
import { saveEnv, resetEnv, stubEnv } from './helpers.js';

beforeAll(() => saveEnv());

describe('TestPluginApiKey', () => {
  beforeEach(() => resetEnv());

  it('returns OG_AUTH_API_KEY when set', () => {
    stubEnv({ OG_AUTH_API_KEY: 'secret-root' });
    expect(getApiKey()).toBe('secret-root');
  });

  it('returns null when no key set', () => {
    expect(getApiKey()).toBeNull();
  });

  it('strips whitespace', () => {
    stubEnv({ OG_AUTH_API_KEY: '  trimmed  ' });
    expect(getApiKey()).toBe('trimmed');
  });
});

describe('TestHttpPluginHeaders', () => {
  beforeEach(() => resetEnv());

  it('returns content-type only when no key', () => {
    expect(buildHeaders()).toEqual({ 'Content-Type': 'application/json' });
  });

  it('adds auth headers when key is set', () => {
    stubEnv({
      OG_AUTH_API_KEY: 'my-key',
      OG_ACCOUNT_ID: 'acct-test',
      OG_USER_ID: 'u-test',
    });
    const headers = buildHeaders();
    expect(headers['X-API-Key']).toBe('my-key');
    expect(headers['X-Account-ID']).toBe('acct-test');
    expect(headers['X-User-ID']).toBe('u-test');
    expect(headers['Content-Type']).toBe('application/json');
  });

  it('does not include X-Agent-ID in headers', () => {
    stubEnv({ OG_AUTH_API_KEY: 'k' });
    expect('X-Agent-ID' in buildHeaders()).toBe(false);
  });
});

describe('TestBaseCtx', () => {
  beforeEach(() => resetEnv());

  it('returns all required keys', () => {
    stubEnv({
      OG_ACCOUNT_ID: 'acct-demo',
      OG_USER_ID: 'u-alice',
      OG_AGENT_ID: 'opencode',
    });
    const ctx = baseCtx('sess-123');
    expect(ctx).toEqual({
      accountId: 'acct-demo',
      userId: 'u-alice',
      agentId: 'opencode',
      sessionId: 'sess-123',
    });
  });

  it('passes sessionId through', () => {
    const ctx = baseCtx('my-session');
    expect(ctx.sessionId).toBe('my-session');
  });

  it('uses defaults when env vars are absent', () => {
    const ctx = baseCtx('sess-1');
    expect(ctx.accountId).toBe('acct-demo');
    expect(ctx.userId).toBe('u-opencode');
    expect(ctx.agentId).toBe('opencode');
  });

  it('prefers OG_MEMORY_* over OG_* variants', () => {
    stubEnv({
      OG_MEMORY_ACCOUNT_ID: 'mem-acct',
      OG_ACCOUNT_ID: 'fallback-acct',
      OG_MEMORY_USER_ID: 'mem-user',
      OG_USER_ID: 'fallback-user',
      OG_MEMORY_AGENT_ID: 'mem-agent',
      OG_AGENT_ID: 'fallback-agent',
    });
    const ctx = baseCtx('s1');
    expect(ctx.accountId).toBe('mem-acct');
    expect(ctx.userId).toBe('mem-user');
    expect(ctx.agentId).toBe('mem-agent');
  });
});

describe('TestBaseApiUrl', () => {
  beforeEach(() => resetEnv());

  it('uses OG_MEMORY_URL env', () => {
    stubEnv({ OG_MEMORY_URL: 'http://remote:9000' });
    expect(getApiBaseUrl()).toBe('http://remote:9000');
  });

  it('strips trailing slashes', () => {
    stubEnv({ OG_MEMORY_URL: 'http://remote:9000/' });
    expect(getApiBaseUrl()).toBe('http://remote:9000');
  });

  it('defaults to localhost:8090 when no env', () => {
    expect(getApiBaseUrl()).toBe('http://localhost:8090');
  });

  it('strips multiple trailing slashes', () => {
    stubEnv({ OG_MEMORY_URL: 'http://remote:9000///' });
    expect(getApiBaseUrl()).toBe('http://remote:9000');
  });
});