// src/contexts/AuthContext.jsx
import React, { createContext, useContext, useState, useEffect } from 'react'
import { useNavigate } from 'react-router-dom'

const AuthContext = createContext()

export const useAuth = () => {
  const context = useContext(AuthContext)
  if (!context) {
    throw new Error('useAuth must be used within an AuthProvider')
  }
  return context
}

export const AuthProvider = ({ children }) => {
  const [user, setUser] = useState(null)
  const [token, setToken] = useState(null)
  const [loading, setLoading] = useState(true)
  const navigate = useNavigate()

  useEffect(() => {
    // Check for stored auth data on app load
    const storedToken = localStorage.getItem('authToken')
    const storedUser = localStorage.getItem('user')
    
    if (storedToken && storedUser) {
      try {
        setToken(storedToken)
        setUser(JSON.parse(storedUser))
      } catch (error) {
        // Clear invalid stored data
        localStorage.removeItem('authToken')
        localStorage.removeItem('user')
      }
    }
    setLoading(false)
  }, [])

  const login = (loginResponse) => {
    const { token, user } = loginResponse
    setToken(token)
    setUser(user)
    localStorage.setItem('authToken', token)
    localStorage.setItem('user', JSON.stringify(user))
    
    // Redirect based on role
    switch (user.role) {
      case 'admin':
        navigate('/home')
        break
      case 'customer':
        navigate('/home')
        break
      case 'farmer':
        navigate('/home')
        break
      default:
        navigate('/home')
    }
  }

  const logout = () => {
    setToken(null)
    setUser(null)
    localStorage.removeItem('authToken')
    localStorage.removeItem('user')
    navigate('/home')
  }

  const isAuthenticated = () => {
    return !!(user && token)
  }

  const value = {
    user,
    token,
    login,
    logout,
    loading,
    isAuthenticated
  }

  return (
    <AuthContext.Provider value={value}>
      {children}
    </AuthContext.Provider>
  )
}