'use client'

import { useState } from 'react'
import {
  WizardStep,
  TestCategoryResult,
  FullTestResults,
  BACKEND_URL,
  INITIAL_STEPS,
} from './types'

export function useTestWizard() {
  const [currentStep, setCurrentStep] = useState(0)
  const [steps, setSteps] = useState<WizardStep[]>(INITIAL_STEPS)
  const [categoryResults, setCategoryResults] = useState<Record<string, TestCategoryResult>>({})
  const [fullResults, setFullResults] = useState<FullTestResults | null>(null)
  const [isLoading, setIsLoading] = useState(false)
  const [error, setError] = useState<string | null>(null)

  const currentStepData = steps[currentStep]
  const isTestStep = currentStepData?.category !== undefined
  const isWelcome = currentStepData?.id === 'welcome'
  const isSummary = currentStepData?.id === 'summary'

  const runCategoryTest = async (category: string) => {
    setIsLoading(true)
    setError(null)

    try {
      const response = await fetch(`${BACKEND_URL}/api/admin/ui-tests/${category}`, {
        method: 'POST',
      })

      if (!response.ok) {
        throw new Error(`HTTP ${response.status}: ${response.statusText}`)
      }

      const result: TestCategoryResult = await response.json()
      setCategoryResults((prev) => ({ ...prev, [category]: result }))

      // Update step status
      setSteps((prev) =>
        prev.map((step) =>
          step.category === category
            ? { ...step, status: result.failed === 0 ? 'completed' : 'failed' }
            : step
        )
      )
    } catch (err) {
      setError(err instanceof Error ? err.message : 'Unbekannter Fehler')
    } finally {
      setIsLoading(false)
    }
  }

  const runAllTests = async () => {
    setIsLoading(true)
    setError(null)

    try {
      const response = await fetch(`${BACKEND_URL}/api/admin/ui-tests/run-all`, {
        method: 'POST',
      })

      if (!response.ok) {
        throw new Error(`HTTP ${response.status}: ${response.statusText}`)
      }

      const results: FullTestResults = await response.json()
      setFullResults(results)

      // Update all step statuses
      setSteps((prev) =>
        prev.map((step) => {
          if (step.category) {
            const catResult = results.categories.find((c) => c.category === step.category)
            if (catResult) {
              return { ...step, status: catResult.failed === 0 ? 'completed' : 'failed' }
            }
          }
          return step
        })
      )

      // Store category results
      const newCategoryResults: Record<string, TestCategoryResult> = {}
      results.categories.forEach((cat) => {
        newCategoryResults[cat.category] = cat
      })
      setCategoryResults(newCategoryResults)
    } catch (err) {
      setError(err instanceof Error ? err.message : 'Unbekannter Fehler')
    } finally {
      setIsLoading(false)
    }
  }

  const goToNext = () => {
    if (currentStep < steps.length - 1) {
      setSteps((prev) =>
        prev.map((step, idx) =>
          idx === currentStep && step.status === 'pending'
            ? { ...step, status: 'completed' }
            : step
        )
      )
      setCurrentStep((prev) => prev + 1)
    }
  }

  const goToPrev = () => {
    if (currentStep > 0) {
      setCurrentStep((prev) => prev - 1)
    }
  }

  const handleStepClick = (index: number) => {
    if (index <= currentStep || steps[index - 1]?.status !== 'pending') {
      setCurrentStep(index)
    }
  }

  return {
    currentStep,
    steps,
    currentStepData,
    categoryResults,
    fullResults,
    isLoading,
    error,
    isTestStep,
    isWelcome,
    isSummary,
    runCategoryTest,
    runAllTests,
    goToNext,
    goToPrev,
    handleStepClick,
  }
}
