'use client';

import React, { createContext, useContext, useState, useEffect } from 'react';
import { useRouter } from 'next/navigation';
import { apiRequest } from '@/lib/api';

export interface User {
  id: string;
  name: string;
  email: string;
  role: 'student' | 'admin' | 'super_admin';
  avatarUrl?: string;
  phoneNumber?: string;
  status?: 'active' | 'deactivated';
}

interface AuthContextType {
  user: User | null;
  token: string | null;
  loading: boolean;
  login: (token: string, user: User) => void;
  logout: () => void;
  refreshUser: () => Promise<void>;
}

const AuthContext = createContext<AuthContextType | undefined>(undefined);

export function AuthProvider({ children }: { children: React.ReactNode }) {
  const [user, setUser] = useState<User | null>(null);
  const [token, setToken] = useState<string | null>(null);
  const [loading, setLoading] = useState(true);
  const router = useRouter();

  useEffect(() => {
    const storedToken = localStorage.getItem('ags_token');
    const storedUser = localStorage.getItem('ags_user');

    if (storedToken && storedUser) {
      try {
        setToken(storedToken);
        setUser(JSON.parse(storedUser));
      } catch {
        localStorage.removeItem('ags_token');
        localStorage.removeItem('ags_user');
      }
    }
    setLoading(false);
  }, []);

  const login = (newToken: string, newUser: User) => {
    setToken(newToken);
    setUser(newUser);
    localStorage.setItem('ags_token', newToken);
    localStorage.setItem('ags_user', JSON.stringify(newUser));

    if (newUser.role === 'admin' || newUser.role === 'super_admin') {
      router.push('/admin/dashboard');
    } else {
      router.push('/student/dashboard');
    }
  };

  const logout = () => {
    setToken(null);
    setUser(null);
    localStorage.removeItem('ags_token');
    localStorage.removeItem('ags_user');
    router.push('/');
  };

  const refreshUser = async () => {
    if (!token) return;
    const res = await apiRequest('/auth/me');
    if (res.success && res.user) {
      setUser(res.user);
      localStorage.setItem('ags_user', JSON.stringify(res.user));
    }
  };

  return (
    <AuthContext.Provider value={{ user, token, loading, login, logout, refreshUser }}>
      {children}
    </AuthContext.Provider>
  );
}

export function useAuth() {
  const context = useContext(AuthContext);
  if (!context) {
    throw new Error('useAuth must be used within an AuthProvider');
  }
  return context;
}
