import {describe, it, expect} from 'vitest'
import {buildMessages, buildResponseFormat, buildInferenceRequest} from '../src/helpers'
import {PromptConfig} from '../src/prompt'

describe('helpers.ts - inference request building', () => {
  describe('buildMessages', () => {
    it('should build messages from prompt config', () => {
      const promptConfig: PromptConfig = {
        messages: [
          {role: 'system', content: 'System message'},
          {role: 'user', content: 'User message'},
        ],
      }

      const result = buildMessages(promptConfig)
      expect(result).toEqual([
        {role: 'system', content: 'System message'},
        {role: 'user', content: 'User message'},
      ])
    })

    it('should build messages from legacy format', () => {
      const result = buildMessages(undefined, 'System prompt', 'User prompt')
      expect(result).toEqual([
        {role: 'system', content: 'System prompt'},
        {role: 'user', content: 'User prompt'},
      ])
    })

    it('should use default system prompt when none provided', () => {
      const result = buildMessages(undefined, undefined, 'User prompt')
      expect(result).toEqual([
        {role: 'system', content: 'You are a helpful assistant'},
        {role: 'user', content: 'User prompt'},
      ])
    })
  })

  describe('buildResponseFormat', () => {
    it('should build JSON schema response format', () => {
      const promptConfig: PromptConfig = {
        messages: [],
        responseFormat: 'json_schema',
        jsonSchema: JSON.stringify({
          name: 'test_schema',
          schema: {type: 'object'},
        }),
      }

      const result = buildResponseFormat(promptConfig)
      expect(result).toEqual({
        type: 'json_schema',
        json_schema: {
          name: 'test_schema',
          schema: {type: 'object'},
        },
      })
    })

    it('should return undefined for text format', () => {
      const promptConfig: PromptConfig = {
        messages: [],
        responseFormat: 'text',
      }

      const result = buildResponseFormat(promptConfig)
      expect(result).toBeUndefined()
    })

    it('should return undefined when no response format specified', () => {
      const promptConfig: PromptConfig = {
        messages: [],
      }

      const result = buildResponseFormat(promptConfig)
      expect(result).toBeUndefined()
    })

    it('should throw error for invalid JSON schema', () => {
      const promptConfig: PromptConfig = {
        messages: [],
        responseFormat: 'json_schema',
        jsonSchema: 'invalid json',
      }

      expect(() => buildResponseFormat(promptConfig)).toThrow('Invalid JSON schema')
    })
  })

  describe('buildInferenceRequest', () => {
    it('should build complete inference request from prompt config', () => {
      const promptConfig: PromptConfig = {
        messages: [
          {role: 'system', content: 'System message'},
          {role: 'user', content: 'User message'},
        ],
        responseFormat: 'json_schema',
        jsonSchema: JSON.stringify({
          name: 'test_schema',
          schema: {type: 'object'},
        }),
      }

      const result = buildInferenceRequest(
        promptConfig,
        undefined,
        undefined,
        'gpt-4',
        undefined,
        undefined,
        100,
        undefined,
        'https://api.test.com',
        'test-token',
      )

      expect(result).toEqual({
        messages: [
          {role: 'system', content: 'System message'},
          {role: 'user', content: 'User message'},
        ],
        modelName: 'gpt-4',
        temperature: undefined,
        topP: undefined,
        maxTokens: 100,
        maxCompletionTokens: undefined,
        endpoint: 'https://api.test.com',
        token: 'test-token',
        responseFormat: {
          type: 'json_schema',
          json_schema: {
            name: 'test_schema',
            schema: {type: 'object'},
          },
        },
      })
    })

    it('should build inference request from legacy format', () => {
      const result = buildInferenceRequest(
        undefined,
        'System prompt',
        'User prompt',
        'gpt-4',
        undefined,
        undefined,
        100,
        undefined,
        'https://api.test.com',
        'test-token',
      )

      expect(result).toEqual({
        messages: [
          {role: 'system', content: 'System prompt'},
          {role: 'user', content: 'User prompt'},
        ],
        modelName: 'gpt-4',
        temperature: undefined,
        topP: undefined,
        maxTokens: 100,
        maxCompletionTokens: undefined,
        endpoint: 'https://api.test.com',
        token: 'test-token',
        responseFormat: undefined,
      })
    })
  })
})
