import { combineReducers } from 'redux';
import storage from 'redux-persist/lib/storage';
import { configureStore } from '@reduxjs/toolkit';
import { persistStore, persistReducer } from 'redux-persist';
import modalReducer from '@/redux/slice/modal-slice';
import snackbarReducer from '@/redux/slice/snackbar-slice';
import productReducer from '@/redux/slice/products-slice';
import cartReducer from '@/redux/slice/cart-slice';
import wishlistReducer from '@/redux/slice/wishlist-slice';
import userReducer from '@/redux/slice/user-slice';
import guestUserReducer from '@/redux/slice/guest-user-slice';
import checkoutReducer from '@/redux/slice/checkout-slice';
import unverifiedUserReducer from '@/redux/slice/unverified-user-slice';
import basicDetailsReducer from '@/redux/slice/basic-details-slice';
import languageReducer from '@/redux/slice/language-slice';
import currenciesReducer from '@/redux/slice/currencies-slice';

const basicDetailsPersistConfig = {
    key: 'basicDetails',
    storage,
    whitelist: ['shipmentSettings', 'defualtSettings', 'deliverySlots', 'socialMediaValues', 'basicDetailsSettings', 'navigationMenu', 'catalog', 'checkout', 'productDetailsPageData', 'lastFetched', 'newsLetterContent'],
};

const rootReducer = combineReducers({
    modal: modalReducer,
    snackbar: snackbarReducer,
    products: productReducer,
    cart: cartReducer,
    wishlist: wishlistReducer,
    user: userReducer,
    guestUser: guestUserReducer,
    checkout: checkoutReducer,
    unverifiedUser: unverifiedUserReducer,
    basicDetails: persistReducer(basicDetailsPersistConfig, basicDetailsReducer),
    language: languageReducer,
    currencies: currenciesReducer,
});

const persistConfig = {
    key: 'root',
    storage,
    whitelist: ['wishlist', 'user', 'cart', 'guestUser'],
};
const persistedReducer = persistReducer(persistConfig, rootReducer);

const store = configureStore({
    reducer: persistedReducer,
    middleware: (getDefaultMiddleware: any) =>
        getDefaultMiddleware({
            serializableCheck: false,
            immutableCheck: false,
        }),
});

const persistor = persistStore(store);

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

export { store, persistor };
