
import { create } from 'zustand';
import { IUser } from '../types';
import { dataService } from '../services/dataService';
import { AuthService } from '../services/authService';

interface AuthState {
  user: IUser | null;
  isLoading: boolean;
  isAuthenticated: boolean;
  initAuth: () => Promise<void>;
  login: (email: string, password: string) => Promise<void>;
  logout: () => Promise<void>;
  setUser: (user: IUser | null) => void;
}

export const useAuthStore = create<AuthState>((set) => ({
  user: null,
  isLoading: true,
  isAuthenticated: false,

  initAuth: async () => {
    try {
      set({ isLoading: true });

      // Only call API if we have a token (to avoid unnecessary 401 errors)
      // getCurrentUser already checks for token, but we can skip the call entirely if no token exists
      const token = localStorage.getItem('auth_token');
      if (!token) {
        // No token - user is not logged in, skip API call to avoid 401 errors
        set({
          user: null,
          isAuthenticated: false,
          isLoading: false
        });
        return;
      }

      // getCurrentUser returns null if not authenticated (401) - this is normal
      const user = await dataService.getCurrentUser();
      set({
        user,
        isAuthenticated: !!user,
        isLoading: false
      });
    } catch (error: any) {
      // Handle any unexpected errors (but 401 is expected and handled silently)
      if (!error.message?.includes('Unauthorized') && !error.message?.includes('401')) {
        console.error('Auth initialization error:', error);
      }
      set({
        user: null,
        isAuthenticated: false,
        isLoading: false
      });
    }
  },

  login: async (email, password) => {
    try {
      const authService = new AuthService();
      const { token, user } = await authService.login(email, password);
      set({ user, isAuthenticated: true });
    } catch (error: any) {
      // Re-throw error with proper message for UI display
      const errorMessage = error.message || 'Đăng nhập thất bại. Vui lòng kiểm tra lại thông tin.';
      throw new Error(errorMessage);
    }
  },

  logout: async () => {
    await dataService.logout();
    set({ user: null, isAuthenticated: false });
  },

  setUser: (user) => set({ user, isAuthenticated: !!user })
}));
