// @vitest-environment jsdom
import { describe, it, expect, beforeEach } from 'vitest'
import { render, screen, fireEvent } from '@testing-library/react'
import { TrackProvider, useTrack, TRACK_OPTIONS } from './trackContext.jsx'

// 이 파일이 하는 일: 과정 선택 컨텍스트의 규칙을 검증한다 —
// 기본값, localStorage 복원, 잘못된 저장값 방어, 변경 시 저장.

// 컨텍스트를 읽고 바꾸는 최소 소비자 컴포넌트.
function Probe() {
  const { track, setTrack } = useTrack()
  return (
    <div>
      <span data-testid="track">{track}</span>
      <button onClick={() => setTrack('lv2')}>중급으로</button>
    </div>
  )
}

beforeEach(() => {
  localStorage.clear()
})

describe('trackContext', () => {
  it('과정 선택지는 수습용+초급~특급 5개다', () => {
    expect(TRACK_OPTIONS.map((t) => t.label)).toEqual(['수습용', '초급', '중급', '고급', '특급'])
  })

  it('저장된 값이 없으면 수습용(trainee)이 기본이다', () => {
    render(<TrackProvider><Probe /></TrackProvider>)
    expect(screen.getByTestId('track')).toHaveTextContent('trainee')
  })

  it('localStorage에 저장된 과정을 복원한다', () => {
    localStorage.setItem('mirim.track', 'lv3')
    render(<TrackProvider><Probe /></TrackProvider>)
    expect(screen.getByTestId('track')).toHaveTextContent('lv3')
  })

  it('저장값이 이상한 값이면 수습용으로 안전하게 폴백한다', () => {
    // 학습 포인트: localStorage는 사용자가 임의로 고칠 수 있는 저장소다 — 항상 검증하고 쓴다.
    localStorage.setItem('mirim.track', 'hacker-value')
    render(<TrackProvider><Probe /></TrackProvider>)
    expect(screen.getByTestId('track')).toHaveTextContent('trainee')
  })

  it('과정을 바꾸면 상태와 localStorage 둘 다 갱신된다', () => {
    render(<TrackProvider><Probe /></TrackProvider>)
    fireEvent.click(screen.getByRole('button', { name: '중급으로' }))
    expect(screen.getByTestId('track')).toHaveTextContent('lv2')
    expect(localStorage.getItem('mirim.track')).toBe('lv2')
  })
})
