import { useState, useEffect } from 'react';
import { authService } from '@/services/authService';

/**
 * Hook de autenticação para a aplicação com persistência.
 * Integra com o authService para autenticação real ou mock.
 */
export const useAuth = () => {
  const [user, setUser] = useState(() => {
    const savedUser = localStorage.getItem('integra_user');
    return savedUser ? JSON.parse(savedUser) : null;
  });
  const [loading, setLoading] = useState(false);
  const [error, setError] = useState(null);

  /**
   * Realiza o login para um ambiente específico.
   * @param {Object} credentials - Email e senha.
   * @param {string} environment - Identificador do ambiente (ex: 'fleet', 'financeiro').
   */
  const login = async ({ email, password }, environment = 'global') => {
    setLoading(true);
    setError(null);
    
    try {
      // Determina qual serviço de autenticação usar com base no ambiente
      let authResponse;
      if (environment === 'fleet' || environment === 'prafrot') {
        authResponse = await authService.loginMonitoramento(email, password);
      } else {
        authResponse = await authService.authenticatePralog(email, password);
      }

      const { token, user: userData } = authResponse;
      
      // Armazena o token no localStorage
      localStorage.setItem('x-access-token', token);
      
      // Recupera o usuário atual ou cria um novo
      let currentUser = user;
      if (!currentUser || currentUser.email !== email) {
        currentUser = {
          id: userData?.id || null,
          name: userData?.name || email.split('@')[0],
          email: userData?.email || email,
          role: userData?.role || 'user',
          permissions: userData?.permissions || [],
          authorizedEnvironments: {}
        };
      }

      // Adiciona o ambiente atual às autorizações
      const updatedUser = {
        ...currentUser,
        authorizedEnvironments: {
          ...currentUser.authorizedEnvironments,
          [environment]: true
        }
      };

      setUser(updatedUser);
      localStorage.setItem('integra_user', JSON.stringify(updatedUser));
      setLoading(false);
      return true;
      
    } catch (err) {
      // Tratamento de erros
      const errorMessage = err.message || 'Erro ao realizar login. Tente novamente.';
      setError(errorMessage);
      setLoading(false);
      return false;
    }
  };

  const logout = () => {
    setUser(null);
    localStorage.removeItem('integra_user');
  };

  /**
   * Verifica se o usuário está autorizado para um ambiente específico.
   */
  const isAuthorized = (environment) => {
    if (!user) return false;
    // Se não for passado ambiente, verifica apenas se está logado globalmente
    if (!environment || environment === 'global') return true;
    return !!user.authorizedEnvironments?.[environment];
  };

  return { user, loading, error, login, logout, isAuthorized };
};
