import { enableMapSet } from 'immer'
import { StrictMode } from 'react'
import { createRoot } from 'react-dom/client'
import './index.css'
import App from './App'
import { loadAutosave, startAutosave } from '@/engine/autosave'
import { hydrateAppState, recomputeHydratedCanvas } from '@/engine/lessonHydration'
import { applyLessonToStores, parseLessonFile } from '@/engine/lessonSerializer'
import { useCanvasStore } from '@/store/canvasStore'
import { useLessonStore } from '@/store/lessonStore'
import { loadAllClusters } from '@/panels/BrickPalette'
import { ErrorBoundary } from '@/components/ErrorBoundary'
import { takeLaunchLesson } from '@/utils/platform'

// Immer requires explicit opt-in for Map and Set support.
enableMapSet()

async function tryLoadLaunchLesson(): Promise<boolean> {
  try {
    const launchedLesson = await takeLaunchLesson()
    if (!launchedLesson) return false

    const parsed = parseLessonFile(launchedLesson.content)
    await loadAllClusters()

    const canvasStore = useCanvasStore.getState()
    const lessonStore = useLessonStore.getState()
    applyLessonToStores(parsed, canvasStore, lessonStore)
    await recomputeHydratedCanvas(canvasStore)

    console.info(`[Launch] Opened lesson from ${launchedLesson.path}`)
    return true
  } catch (error) {
    console.error('[Launch] Failed to open lesson from launch arguments:', error)
    return false
  }
}

async function bootstrap() {
  const launchedLessonLoaded = await tryLoadLaunchLesson()
  const snapshot = launchedLessonLoaded ? null : await loadAutosave()

  if (snapshot) {
    if (snapshot.bricks.length > 0 || snapshot.wires.length > 0) {
      await loadAllClusters()
    }

    const canvasStore = useCanvasStore.getState()
    const lessonStore = useLessonStore.getState()
    hydrateAppState(snapshot, canvasStore, lessonStore)

    await recomputeHydratedCanvas(useCanvasStore.getState())

    console.info(`[Autosave] Restored: ${snapshot.bricks.length} bricks, mode=${snapshot.isProfessorMode ? 'professor' : snapshot.hasActiveLesson ? 'student' : 'free'}`)
  }

  startAutosave()

  const root = document.getElementById('root')
  if (!root) throw new Error('Root element not found')

  createRoot(root).render(
    <StrictMode>
      <ErrorBoundary scope="app">
        <App />
      </ErrorBoundary>
    </StrictMode>,
  )
}

void bootstrap()
