import { configureStore } from '@reduxjs/toolkit';
import {
  persistStore,
  persistReducer,
  FLUSH,
  REHYDRATE,
  PAUSE,
  PERSIST,
  PURGE,
  REGISTER,
} from 'redux-persist';
import { combineReducers } from 'redux';
import authReducer from './slices/auth-slice';
import referenceReducer from './slices/reference-slice';
import installationReducer from './slices/installation-slice';

// Storage is only available client-side — guard against SSR
const createStorage = () => {
  if (typeof window !== 'undefined') {
    return require('redux-persist/lib/storage').default;
  }
  return {
    getItem: () => Promise.resolve(null),
    setItem: () => Promise.resolve(),
    removeItem: () => Promise.resolve(),
  };
};

// Seul `auth` est persisté. Le wizard d'installation n'est volontairement PAS
// persisté : localStorage est partagé entre tous les onglets, donc persister le
// slice `installation` faisait que chaque onglet rechargeait la DERNIÈRE pose
// écrite (bug multi-onglets). La pose est désormais identifiée par son ID dans
// l'URL (`/installation/[id]`) et réhydratée depuis le serveur — source de
// vérité, chaque étape étant déjà sauvegardée côté backend.
const persistConfig = {
  key: 'root',
  storage: createStorage(),
  whitelist: ['auth'],
};

const rootReducer = combineReducers({
  auth: authReducer,
  reference: referenceReducer,
  installation: installationReducer,
});

const persistedReducer = persistReducer(persistConfig, rootReducer);

export const store = configureStore({
  reducer: persistedReducer,
  middleware: (getDefaultMiddleware) =>
    getDefaultMiddleware({
      serializableCheck: {
        ignoredActions: [FLUSH, REHYDRATE, PAUSE, PERSIST, PURGE, REGISTER],
      },
    }),
});

export const persistor = persistStore(store);

export type RootState = ReturnType<typeof rootReducer>;
export type AppDispatch = typeof store.dispatch;
