import { tap, expect } from '@git.zone/tstest/tapbundle';
import * as smartai from '../ts/index.js';

// Basic instantiation tests that don't require API tokens
// These tests can run in CI/CD environments without credentials

tap.test('Basic: should create SmartAi instance', async () => {
  const testSmartai = new smartai.SmartAi({
    openaiToken: 'dummy-token-for-testing'
  });
  expect(testSmartai).toBeInstanceOf(smartai.SmartAi);
  // Provider is only created after calling start()
  expect(testSmartai.options.openaiToken).toEqual('dummy-token-for-testing');
});

tap.test('Basic: should instantiate OpenAI provider', async () => {
  const openaiProvider = new smartai.OpenAiProvider({
    openaiToken: 'dummy-token'
  });
  expect(openaiProvider).toBeInstanceOf(smartai.OpenAiProvider);
  expect(typeof openaiProvider.chat).toEqual('function');
  expect(typeof openaiProvider.audio).toEqual('function');
  expect(typeof openaiProvider.vision).toEqual('function');
  expect(typeof openaiProvider.document).toEqual('function');
  expect(typeof openaiProvider.research).toEqual('function');
});

tap.test('Basic: should instantiate Anthropic provider', async () => {
  const anthropicProvider = new smartai.AnthropicProvider({
    anthropicToken: 'dummy-token'
  });
  expect(anthropicProvider).toBeInstanceOf(smartai.AnthropicProvider);
  expect(typeof anthropicProvider.chat).toEqual('function');
  expect(typeof anthropicProvider.audio).toEqual('function');
  expect(typeof anthropicProvider.vision).toEqual('function');
  expect(typeof anthropicProvider.document).toEqual('function');
  expect(typeof anthropicProvider.research).toEqual('function');
});

tap.test('Basic: should instantiate Perplexity provider', async () => {
  const perplexityProvider = new smartai.PerplexityProvider({
    perplexityToken: 'dummy-token'
  });
  expect(perplexityProvider).toBeInstanceOf(smartai.PerplexityProvider);
  expect(typeof perplexityProvider.chat).toEqual('function');
  expect(typeof perplexityProvider.research).toEqual('function');
});

tap.test('Basic: should instantiate Groq provider', async () => {
  const groqProvider = new smartai.GroqProvider({
    groqToken: 'dummy-token'
  });
  expect(groqProvider).toBeInstanceOf(smartai.GroqProvider);
  expect(typeof groqProvider.chat).toEqual('function');
  expect(typeof groqProvider.research).toEqual('function');
});

tap.test('Basic: should instantiate Ollama provider', async () => {
  const ollamaProvider = new smartai.OllamaProvider({
    baseUrl: 'http://localhost:11434'
  });
  expect(ollamaProvider).toBeInstanceOf(smartai.OllamaProvider);
  expect(typeof ollamaProvider.chat).toEqual('function');
  expect(typeof ollamaProvider.research).toEqual('function');
});

tap.test('Basic: should instantiate xAI provider', async () => {
  const xaiProvider = new smartai.XAIProvider({
    xaiToken: 'dummy-token'
  });
  expect(xaiProvider).toBeInstanceOf(smartai.XAIProvider);
  expect(typeof xaiProvider.chat).toEqual('function');
  expect(typeof xaiProvider.research).toEqual('function');
});

tap.test('Basic: should instantiate Exo provider', async () => {
  const exoProvider = new smartai.ExoProvider({
    exoBaseUrl: 'http://localhost:8000'
  });
  expect(exoProvider).toBeInstanceOf(smartai.ExoProvider);
  expect(typeof exoProvider.chat).toEqual('function');
  expect(typeof exoProvider.research).toEqual('function');
});

tap.test('Basic: all providers should extend MultiModalModel', async () => {
  const openai = new smartai.OpenAiProvider({ openaiToken: 'test' });
  const anthropic = new smartai.AnthropicProvider({ anthropicToken: 'test' });

  expect(openai).toBeInstanceOf(smartai.MultiModalModel);
  expect(anthropic).toBeInstanceOf(smartai.MultiModalModel);
});

export default tap.start();