import React, { createContext, useState, useContext, useEffect } from 'react';
import axios from 'axios';
import toast from 'react-hot-toast';

const AuthContext = createContext({});

export const useAuth = () => useContext(AuthContext);

export const AuthProvider = ({ children }) => {
  const [user, setUser] = useState(null);
  const [loading, setLoading] = useState(true);
  const [isAdmin, setIsAdmin] = useState(false);

  useEffect(() => {
    const token = localStorage.getItem('token');
    const userData = localStorage.getItem('user');
    
    if (token && userData) {
      setUser(JSON.parse(userData));
      axios.defaults.headers.common['Authorization'] = `Bearer ${token}`;
      setIsAdmin(JSON.parse(userData).role === 'admin');
    }
    
    setLoading(false);
  }, []);

  const login = async (credentials) => {
    try {
      const response = await axios.post('/api/auth/login', credentials);
      const { token, user } = response.data;
      
      localStorage.setItem('token', token);
      localStorage.setItem('user', JSON.stringify(user));
      
      axios.defaults.headers.common['Authorization'] = `Bearer ${token}`;
      setUser(user);
      setIsAdmin(user.role === 'admin');
      
      toast.success('Успешный вход в систему!');
      return { success: true };
    } catch (error) {
      const message = error.response?.data?.error || 'Ошибка при входе';
      toast.error(message);
      return { success: false, error: message };
    }
  };

  const register = async (userData) => {
    try {
      const response = await axios.post('/api/auth/register', userData);
      toast.success('Регистрация успешна! Теперь войдите в систему.');
      return { success: true };
    } catch (error) {
      const message = error.response?.data?.error || 'Ошибка при регистрации';
      toast.error(message);
      return { success: false, error: message };
    }
  };

  const adminLogin = async (credentials) => {
    try {
      // Проверяем админские права
      const checkResponse = await axios.post('/api/admin/check', credentials);
      
      if (checkResponse.data.isAdmin) {
        // Логинимся как админ
        const loginResponse = await axios.post('/api/auth/login', credentials);
        const { token, user } = loginResponse.data;
        
        localStorage.setItem('token', token);
        localStorage.setItem('user', JSON.stringify(user));
        
        axios.defaults.headers.common['Authorization'] = `Bearer ${token}`;
        setUser(user);
        setIsAdmin(true);
        
        toast.success('Вход в админ панель выполнен!');
        return { success: true };
      }
    } catch (error) {
      const message = error.response?.data?.error || 'Ошибка при входе';
      toast.error(message);
      return { success: false, error: message };
    }
  };

  const logout = () => {
    localStorage.removeItem('token');
    localStorage.removeItem('user');
    delete axios.defaults.headers.common['Authorization'];
    setUser(null);
    setIsAdmin(false);
    toast.success('Вы вышли из системы');
  };

  const value = {
    user,
    isAdmin,
    loading,
    login,
    register,
    adminLogin,
    logout,
  };

  return (
    <AuthContext.Provider value={value}>
      {children}
    </AuthContext.Provider>
  );
};
