import { createStore, applyMiddleware, compose } from 'redux';
import createSagaMiddleware from 'redux-saga';
import { reducer } from './reducers';
import { persistStore, persistReducer } from 'redux-persist';
import storage from 'redux-persist/lib/storage';
// import storage from 'redux-persist-indexeddb-storage';
// import localforage from 'localforage';
// import storageSession from 'redux-persist/lib/storage/session';
import hardSet from 'redux-persist/lib/stateReconciler/hardSet';
import { encryptTransform } from 'redux-persist-transform-encrypt';
// import { removeCookie } from '@modules/cookies';
// import autoMergeLevel1 from 'redux-persist/lib/stateReconciler/autoMergeLevel1';
import createCompressor from 'redux-persist-transform-compress';
//@ts-ignore
import reduxPersistExpectIngs from 'redux-persist-except-ings';

// create the saga middleware
export const sagaMiddleware = createSagaMiddleware();


// persist config
// removeCookie('persist:webframe');
const persistConfig = {
	key: 'assembly',
	storage,
	// storage: storageSession,
	// M5P7Q8RATB
	// storage: storage('M5P7Q8RATWW'),
	blacklist: ['globalLogin', 'single_clasified'],
	whitelist: ['userState'],
	// whitelist: ['classifieds', 'shops', 'districts', 'userState', 'status', 'shop'],
	stateReconciler: hardSet,
	transforms: [
		reduxPersistExpectIngs,
		encryptTransform({
			secretKey: 'TBUDWEXFYH2J3K5N6P7R9SATCV',
			onError: function(error) {
				// Handle the error.
				// console.log('PERSIST ENCRYPT ERROR:', error);
			},
		}),
		createCompressor(),
	]
};

// dev tools middleware
// const reduxDevTools =
// window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__();


const persistedReducer = persistReducer(persistConfig, reducer);

const composeEnhancers = (typeof window !== 'undefined' && (window as any).__REDUX_DEVTOOLS_EXTENSION_COMPOSE__) || compose;


// create a redux store with our reducer above and middleware
export const store = createStore(
	// reducer,
	persistedReducer,
	composeEnhancers(applyMiddleware(sagaMiddleware)),
	// compose(applyMiddleware(sagaMiddleware), reduxDevTools)
);

export const persistor = persistStore(store);

export const dispatch = (actions: any) => store.dispatch(actions);

export const getState = () => store.getState();
