import { configureStore } from '@reduxjs/toolkit';
import {
  persistStore,
  persistReducer,
  createMigrate,
  FLUSH,
  REHYDRATE,
  PAUSE,
  PERSIST,
  PURGE,
  REGISTER,
} from 'redux-persist';
import storage from 'redux-persist/lib/storage';
import rootReducer, { RootState } from './rootReducer';
import { baseApi } from '../api/baseApi';
import { REDUX_PERSIST_KEY } from '../api/constant';

const migrations: Record<number, (state: object | undefined) => object> = {
  2: (state: object | undefined) => {
    const s = (state ?? {}) as Record<string, unknown>;
    const { user, ...rest } = s;
    return { ...rest, auth: user ?? rest.auth };
  },
};

const persistConfig = {
  key: REDUX_PERSIST_KEY,
  version: 2,
  storage,
  whitelist: ['auth'],
  migrate: createMigrate(migrations as Parameters<typeof createMigrate>[0], { debug: false }),
};

const persistedReducer = persistReducer(persistConfig, rootReducer);

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

export const persistor = persistStore(store);

export type { RootState };
export type AppDispatch = typeof store.dispatch;
