import { describe, it, expect } from 'vitest'
import { STEP_EXPLANATIONS } from '../StepHeader'

type StepExplanationKey = keyof typeof STEP_EXPLANATIONS

// Focus on testing the STEP_EXPLANATIONS data structure
// Component tests require more complex SDK context mocking

describe('STEP_EXPLANATIONS', () => {
  it('should have explanations for all Phase 1 steps', () => {
    const phase1Steps: StepExplanationKey[] = [
      'use-case-workshop',
      'screening',
      'modules',
      'requirements',
      'controls',
      'evidence',
      'audit-checklist',
      'risks',
    ]

    phase1Steps.forEach(stepId => {
      expect(STEP_EXPLANATIONS[stepId]).toBeDefined()
      expect(STEP_EXPLANATIONS[stepId].title).toBeDefined()
      expect(STEP_EXPLANATIONS[stepId].title.length).toBeGreaterThan(0)
      expect(STEP_EXPLANATIONS[stepId].description).toBeDefined()
      expect(STEP_EXPLANATIONS[stepId].description.length).toBeGreaterThan(0)
      expect(STEP_EXPLANATIONS[stepId].explanation).toBeDefined()
      expect(STEP_EXPLANATIONS[stepId].explanation.length).toBeGreaterThan(0)
    })
  })

  it('should have explanations for all Phase 2 steps', () => {
    const phase2Steps: StepExplanationKey[] = [
      'ai-act',
      'obligations',
      'dsfa',
      'tom',
      'loeschfristen',
      'vvt',
      'consent',
      'cookie-banner',
      'einwilligungen',
      'dsr',
      'escalations',
    ]

    phase2Steps.forEach(stepId => {
      expect(STEP_EXPLANATIONS[stepId]).toBeDefined()
      expect(STEP_EXPLANATIONS[stepId].title).toBeDefined()
      expect(STEP_EXPLANATIONS[stepId].description).toBeDefined()
    })
  })

  it('should have tips array for each step explanation', () => {
    Object.entries(STEP_EXPLANATIONS).forEach(([stepId, explanation]) => {
      expect(explanation.tips).toBeDefined()
      expect(Array.isArray(explanation.tips)).toBe(true)
      expect(explanation.tips.length).toBeGreaterThan(0)
    })
  })

  it('should have valid tip icons', () => {
    const validIcons = ['info', 'warning', 'success', 'lightbulb']

    Object.entries(STEP_EXPLANATIONS).forEach(([stepId, explanation]) => {
      explanation.tips.forEach((tip, tipIndex) => {
        expect(validIcons).toContain(tip.icon)
        expect(tip.title).toBeDefined()
        expect(tip.title.length).toBeGreaterThan(0)
        expect(tip.description).toBeDefined()
        expect(tip.description.length).toBeGreaterThan(0)
      })
    })
  })

  it('should have a use-case-workshop explanation', () => {
    const ucWorkshop = STEP_EXPLANATIONS['use-case-workshop']

    expect(ucWorkshop.title).toContain('Use Case')
    expect(ucWorkshop.tips.length).toBeGreaterThanOrEqual(2)
  })

  it('should have a risks explanation', () => {
    const risks = STEP_EXPLANATIONS['risks']

    expect(risks.title).toBeDefined()
    expect(risks.explanation).toContain('Risiko')
  })

  it('should have a dsfa explanation', () => {
    const dsfa = STEP_EXPLANATIONS['dsfa']

    expect(dsfa.title).toContain('Datenschutz')
    expect(dsfa.explanation.length).toBeGreaterThan(50)
  })

  it('should cover all core SDK steps', () => {
    const coreStepIds: StepExplanationKey[] = [
      // Phase 1
      'use-case-workshop',
      'screening',
      'modules',
      'requirements',
      'controls',
      'evidence',
      'audit-checklist',
      'risks',
      // Phase 2
      'ai-act',
      'obligations',
      'dsfa',
      'tom',
      'loeschfristen',
      'vvt',
      'consent',
      'cookie-banner',
      'einwilligungen',
      'dsr',
      'escalations',
    ]

    coreStepIds.forEach(stepId => {
      expect(STEP_EXPLANATIONS[stepId]).toBeDefined()
    })

    // Ensure we have at least the core steps plus additional module explanations
    expect(Object.keys(STEP_EXPLANATIONS).length).toBeGreaterThanOrEqual(coreStepIds.length)
  })
})
