// Zustand store for app-level shared state (persisted to sessionStorage).
// No provider needed — import useAppStore or useAppContext anywhere.

import { create } from 'zustand';
import { persist, createJSONStorage } from 'zustand/middleware';

interface AppState {
  currentUser: { userId: string; email: string; firstName: string; lastName: string; role: 'user' | 'admin' } | null;
  setCurrentUser: (value: { userId: string; email: string; firstName: string; lastName: string; role: 'user' | 'admin' } | null) => void;
  authToken: string | null;
  setAuthToken: (value: string | null) => void;
  preferredUnit: 'metric' | 'imperial';
  setPreferredUnit: (value: 'metric' | 'imperial') => void;
  userProfile: { profileId: string; heightCm: number | null; currentWeightKg: number | null; targetBMI: number | null } | null;
  setUserProfile: (value: { profileId: string; heightCm: number | null; currentWeightKg: number | null; targetBMI: number | null } | null) => void;
  sessionId: string;
  clearSession: () => void;
}

const useAppStore = create<AppState>()((
  persist(
    (set) => ({
    sessionId: crypto.randomUUID(),
    currentUser: null,
    authToken: null,
    preferredUnit: "metric",
    userProfile: null,
    setCurrentUser: (value) => set({ currentUser: value }),
    setAuthToken: (value) => set({ authToken: value }),
    setPreferredUnit: (value) => set({ preferredUnit: value }),
    setUserProfile: (value) => set({ userProfile: value }),
    clearSession: () => set({ sessionId: crypto.randomUUID(), currentUser: null, authToken: null, preferredUnit: "metric", userProfile: null }),
    }),
    {
      name: 'bmi_calculator_session',
      storage: createJSONStorage(() => sessionStorage),
    },
  )
));

// Convenience alias — pages import useAppContext.
const useAppContext = useAppStore;

export { useAppStore, useAppContext };
