import { describe, expect, it } from 'vitest'

import { computeCoverageView, computeStatusMatrixView } from '../react-pilot/src/demos/lib/figma-members-view'
import { progressFigmaMembers } from '../figma-data/normalized/docs-figma-members/progress'

describe('computeCoverageView', () => {
  it('filters Progress dark-theme variants and formats axes/meta like FigmaMembersGrid.vue', () => {
    const view = computeCoverageView(progressFigmaMembers, 'dark')

    expect(view.axes).toHaveLength(3)
    expect(view.axes.map((axis) => axis.codeProp)).toEqual(['theme', 'status', 'size'])

    expect(view.variants).toHaveLength(8)
    expect(view.variants.every((variant) => variant.label.includes('theme=dark'))).toBe(true)

    expect(view.meta).toBe('source=Progress · nodeId=4915:7287 · variant count=8')
  })

  it('formats each variant label as "axis=value, axis=value, …" in axis order', () => {
    const view = computeCoverageView(progressFigmaMembers, 'dark')
    const first = view.variants[0]

    expect(first.label).toBe(
      ['theme', 'status', 'size']
        .map((codeProp) => `${codeProp}=${first.props[codeProp]}`)
        .join(', '),
    )
  })
})

describe('computeStatusMatrixView', () => {
  it('derives state axes / held-constant / meta for Progress like StatusMatrix.vue', () => {
    const view = computeStatusMatrixView(progressFigmaMembers, 'dark')

    expect(view.hasStateAxis).toBe(true)
    expect(view.stateAxes.map((axis) => axis.codeProp)).toEqual(['status'])
    expect(view.heldConstant).toEqual(['size=M'])

    expect(view.variants).toHaveLength(4)
    const statuses = view.variants.map((variant) => variant.cellProps.status)
    expect(statuses).toEqual(['default', 'success', 'error', 'warning'])

    expect(view.meta).toBe('source=Progress · nodeId=4915:7287 · states=4 · theme=dark')
  })

  it('holds size=S constant when baseProps overrides the representative value', () => {
    const view = computeStatusMatrixView(progressFigmaMembers, 'dark', { size: 'S' })

    expect(view.heldConstant).toEqual(['size=S'])
    expect(view.variants).toHaveLength(4)
    expect(view.variants.every((variant) => variant.cellProps.size === 'S')).toBe(true)
  })

  it('preserves the original Figma variant on each entry for the #cell scoped-slot contract', () => {
    const view = computeStatusMatrixView(progressFigmaMembers, 'dark')

    for (const entry of view.variants) {
      expect(entry.variant.variantId).toBe(entry.variantId)
      expect(entry.variant.props.status).toBe(entry.cellProps.status)
    }
  })
})
