import type { DataSet } from '@/models/datasets'
import { knowledgeAction } from '../knowledge'

vi.mock('@/service/datasets', () => ({
  fetchDatasets: vi.fn(),
}))

vi.mock('@langgenius/dify-ui/cn', () => ({
  cn: (...args: string[]) => args.filter(Boolean).join(' '),
}))

describe('knowledgeAction', () => {
  beforeEach(() => {
    vi.clearAllMocks()
  })

  it('has correct metadata', () => {
    expect(knowledgeAction.key).toBe('@knowledge')
    expect(knowledgeAction.shortcut).toBe('@kb')
  })

  it('returns parsed dataset results on success', async () => {
    const { fetchDatasets } = await import('@/service/datasets')
    vi.mocked(fetchDatasets).mockResolvedValue({
      data: [
        { id: 'ds-1', name: 'My Knowledge', description: 'A KB', provider: 'vendor', embedding_available: true } as unknown as DataSet,
      ],
      has_more: false,
      limit: 10,
      page: 1,
      total: 1,
    })

    const results = await knowledgeAction.search('@knowledge query', 'query', 'en')

    expect(fetchDatasets).toHaveBeenCalledWith({
      url: '/datasets',
      params: { page: 1, limit: 10, keyword: 'query' },
    })
    expect(results).toHaveLength(1)
    expect(results[0]).toMatchObject({
      id: 'ds-1',
      title: 'My Knowledge',
      type: 'knowledge',
    })
  })

  it('generates correct path for external provider', async () => {
    const { fetchDatasets } = await import('@/service/datasets')
    vi.mocked(fetchDatasets).mockResolvedValue({
      data: [
        { id: 'ds-ext', name: 'External', description: '', provider: 'external', embedding_available: true } as unknown as DataSet,
      ],
      has_more: false,
      limit: 10,
      page: 1,
      total: 1,
    })

    const results = await knowledgeAction.search('@knowledge', '', 'en')

    expect(results[0]!.path).toBe('/datasets/ds-ext/hitTesting')
  })

  it('generates correct path for non-external provider', async () => {
    const { fetchDatasets } = await import('@/service/datasets')
    vi.mocked(fetchDatasets).mockResolvedValue({
      data: [
        { id: 'ds-2', name: 'Internal', description: '', provider: 'vendor', embedding_available: true } as unknown as DataSet,
      ],
      has_more: false,
      limit: 10,
      page: 1,
      total: 1,
    })

    const results = await knowledgeAction.search('@knowledge', '', 'en')

    expect(results[0]!.path).toBe('/datasets/ds-2/documents')
  })

  it('returns empty array on API failure', async () => {
    const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {})
    const { fetchDatasets } = await import('@/service/datasets')
    vi.mocked(fetchDatasets).mockRejectedValue(new Error('fail'))

    const results = await knowledgeAction.search('@knowledge', 'fail', 'en')
    expect(results).toEqual([])
    expect(warnSpy).toHaveBeenCalledWith('Knowledge search failed:', expect.any(Error))
    warnSpy.mockRestore()
  })
})
