/* Contexte d'authentification global : gestion de l'utilisateur connecté */

import { createContext, useContext, useState } from 'react';
import * as api from '../services/api';

const AuthContext = createContext(null);

const STORAGE_KEY = 'ds_user';

/* Fournisseur du contexte d'authentification */
export function AuthProvider({ children }) {
  const [user, setUser] = useState(() => {
    /* Restauration de la session depuis le localStorage au montage */
    const stored = localStorage.getItem(STORAGE_KEY);
    return stored ? JSON.parse(stored) : null;
  });

  /* Connexion : appelle l'API, stocke le token + l'utilisateur retourné */
  async function login(username, password) {
    const connectedUser = await api.login(username, password);
    setUser(connectedUser);
    localStorage.setItem(STORAGE_KEY, JSON.stringify(connectedUser));
    return connectedUser;
  }

  /* Déconnexion : vide le token, le state et le localStorage */
  function logout() {
    api.clearToken();
    setUser(null);
    localStorage.removeItem(STORAGE_KEY);
  }

  /* Booléen pratique pour savoir si l'utilisateur est connecté */
  const isAuthenticated = !!user;

  return (
    <AuthContext.Provider value={{ user, login, logout, isAuthenticated }}>
      {children}
    </AuthContext.Provider>
  );
}

/* Hook personnalisé pour accéder au contexte d'authentification */
export function useAuth() {
  const context = useContext(AuthContext);
  if (!context) {
    throw new Error('useAuth doit être utilisé dans un AuthProvider');
  }
  return context;
}
