// src/store/useAuthStore.ts
import { create } from 'zustand';
import { persist, createJSONStorage } from 'zustand/middleware';
import { AuthState } from '../interfaces/types';
import { clearAuthData } from '../utils/tokenRefresh';

/**
 * Store de autenticação usando apenas dados não sensíveis
 *
 * Arquitetura Híbrida:
 * - accessToken: Armazenado em memória (tokenRefresh.ts)
 * - refreshToken: Gerenciado via cookies HTTP-only pelo backend
 * - user profile: Persistido no localStorage (dados não sensíveis)
 *
 * O método hydrate() valida a sincronização entre token e estado ao recarregar
 */
export const useAuthStore = create<AuthState>()(
  persist(
    (set, get) => ({
      user: null,
      isAuthenticated: false,

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

      logout: () => {
        clearAuthData();
        set({ user: null, isAuthenticated: false });
      },

      /**
       * Valida sincronização entre token em memória e estado persistido
       * Chamado automaticamente ao recarregar a página (onRehydrateStorage)
       */
      hydrate: () => {},
    }),
    {
      name: 'auth-storage',
      storage: createJSONStorage(() => localStorage),
      partialize: (state) => ({
        user: state.user,
      }),
      onRehydrateStorage: () => (state) => {
        state?.hydrate();
      },
    }
  )
);
