import { expect, tap } from '@git.zone/tstest/tapbundle';
import * as qenv from '@push.rocks/qenv';

const testQenv = new qenv.Qenv('./', './.nogit/');

import * as smartai from '../ts/index.js';

let anthropicProvider: smartai.AnthropicProvider;

tap.test('Anthropic Chat: should create and start Anthropic provider', async () => {
  anthropicProvider = new smartai.AnthropicProvider({
    anthropicToken: await testQenv.getEnvVarOnDemand('ANTHROPIC_TOKEN'),
  });
  await anthropicProvider.start();
  expect(anthropicProvider).toBeInstanceOf(smartai.AnthropicProvider);
});

tap.test('Anthropic Chat: should create chat response', async () => {
  const userMessage = 'What is the capital of France? Answer in one word.';
  const response = await anthropicProvider.chat({
    systemMessage: 'You are a helpful assistant. Be concise.',
    userMessage: userMessage,
    messageHistory: [],
  });
  console.log(`Anthropic Chat - User: ${userMessage}`);
  console.log(`Anthropic Chat - Response: ${response.message}`);

  expect(response.role).toEqual('assistant');
  expect(response.message).toBeTruthy();
  expect(response.message.toLowerCase()).toInclude('paris');
});

tap.test('Anthropic Chat: should handle message history', async () => {
  const messageHistory: smartai.ChatMessage[] = [
    { role: 'user', content: 'My name is Claude Test' },
    { role: 'assistant', content: 'Nice to meet you, Claude Test!' }
  ];

  const response = await anthropicProvider.chat({
    systemMessage: 'You are a helpful assistant with good memory.',
    userMessage: 'What is my name?',
    messageHistory: messageHistory,
  });

  console.log(`Anthropic Memory Test - Response: ${response.message}`);
  expect(response.message.toLowerCase()).toInclude('claude test');
});

tap.test('Anthropic Chat: should handle errors gracefully', async () => {
  // Test with invalid message (empty)
  let errorCaught = false;

  try {
    await anthropicProvider.chat({
      systemMessage: '',
      userMessage: '',
      messageHistory: [],
    });
  } catch (error) {
    errorCaught = true;
    console.log('Expected error caught:', error.message);
  }

  // Anthropic might handle empty messages, so we don't assert error
  console.log(`Error handling test - Error caught: ${errorCaught}`);
});

tap.test('Anthropic Chat: should stop the provider', async () => {
  await anthropicProvider.stop();
});

export default tap.start();
