import { describe, it, expect, vi } from 'vitest'
import { findSimvsmDuplicatesBySignature, findSimvsmImportByConfirmationSignature } from '../duplicates'

function makeSupabase(result: { data: unknown; error: null | { message: string } }) {
  const chain: Record<string, unknown> = {}
  chain.select = vi.fn(() => chain)
  chain.in = vi.fn(() => Promise.resolve(result))
  chain.eq = vi.fn(() => Promise.resolve(result))
  return { from: vi.fn(() => chain), _chain: chain }
}

describe('findSimvsmDuplicatesBySignature', () => {
  it('returns empty/not-degraded for an empty signature list without querying', async () => {
    const supabase = makeSupabase({ data: [], error: null })
    const result = await findSimvsmDuplicatesBySignature(supabase as never, [])
    expect(result).toEqual({ bySignature: {}, degraded: false })
    expect(supabase.from).not.toHaveBeenCalled()
  })

  it('maps a matching row by its layout.simvsmSource.sourceSignature', async () => {
    const supabase = makeSupabase({
      data: [{ id: 'vsm-1', title: 'Werk Nord', layout: { simvsmSource: { sourceSignature: 'sig-a' } } }],
      error: null,
    })
    const result = await findSimvsmDuplicatesBySignature(supabase as never, ['sig-a', 'sig-b'])
    expect(result.degraded).toBe(false)
    expect(result.bySignature['sig-a']).toEqual({ valueStreamId: 'vsm-1', title: 'Werk Nord' })
    expect(result.bySignature['sig-b']).toBeUndefined()
  })

  it('marks degraded:true on a query error, never a false "no duplicates" result', async () => {
    const supabase = makeSupabase({ data: null, error: { message: 'db down' } })
    const result = await findSimvsmDuplicatesBySignature(supabase as never, ['sig-a'])
    expect(result.degraded).toBe(true)
    expect(result.bySignature).toEqual({})
  })

  it('ignores a row whose layout has no simvsmSource at all', async () => {
    const supabase = makeSupabase({ data: [{ id: 'vsm-1', title: 'x', layout: { viewport: {} } }], error: null })
    const result = await findSimvsmDuplicatesBySignature(supabase as never, ['sig-a'])
    expect(result.bySignature).toEqual({})
  })
})

describe('findSimvsmImportByConfirmationSignature', () => {
  it('returns rows matching the importSignature', async () => {
    const supabase = makeSupabase({
      data: [{ id: 'vsm-1', title: 'Werk Nord', scenario_kind: 'current', parent_value_stream_id: null }],
      error: null,
    })
    const result = await findSimvsmImportByConfirmationSignature(supabase as never, 'confirm-sig')
    expect(result.ok).toBe(true)
    if (result.ok) expect(result.rows).toHaveLength(1)
  })

  it('returns ok:false on a query error', async () => {
    const supabase = makeSupabase({ data: null, error: { message: 'db down' } })
    const result = await findSimvsmImportByConfirmationSignature(supabase as never, 'confirm-sig')
    expect(result.ok).toBe(false)
  })
})
