import { hot } from 'react-hot-loader/root';
import { connect } from 'react-redux';
import {
  selectGetSyncErrorMessage,
  selectPrefsReady,
  selectSyncFatalError,
  selectSyncIsLocked,
} from 'redux/selectors/sync';
import { doUserSetReferrer } from 'redux/actions/user';
import { doSetLastViewedAnnouncement } from 'redux/actions/content';
import { selectUser, selectUserLocale, selectUserVerifiedEmail, selectHomepageFetched } from 'redux/selectors/user';
import { selectUnclaimedRewards } from 'redux/selectors/rewards';
import { doFetchChannelListMine, doFetchCollectionListMine } from 'redux/actions/claims';
import { selectMyChannelClaimIds } from 'redux/selectors/claims';
import {
  selectLanguage,
  selectLoadedLanguages,
  selectThemePath,
  selectDefaultChannelClaim,
} from 'redux/selectors/settings';
import { selectModal, selectActiveChannelClaim, selectIsReloadRequired } from 'redux/selectors/app';
import { selectUploadCount } from 'redux/selectors/publish';
import { doOpenAnnouncements, doSetLanguage, doSetDefaultChannel } from 'redux/actions/settings';
import { doSyncLoop } from 'redux/actions/sync';
import { doSignIn, doSetIncognito } from 'redux/actions/app';
import { doFetchModBlockedList, doFetchCommentModAmIList } from 'redux/actions/comments';
import App from './view';

const select = (state) => ({
  user: selectUser(state),
  locale: selectUserLocale(state),
  theme: selectThemePath(state),
  language: selectLanguage(state),
  languages: selectLoadedLanguages(state),
  isReloadRequired: selectIsReloadRequired(state),
  prefsReady: selectPrefsReady(state),
  syncError: selectGetSyncErrorMessage(state),
  syncIsLocked: selectSyncIsLocked(state),
  uploadCount: selectUploadCount(state),
  rewards: selectUnclaimedRewards(state),
  isAuthenticated: selectUserVerifiedEmail(state),
  currentModal: selectModal(state),
  syncFatalError: selectSyncFatalError(state),
  activeChannelClaim: selectActiveChannelClaim(state),
  myChannelClaimIds: selectMyChannelClaimIds(state),
  homepageFetched: selectHomepageFetched(state),
  defaultChannelClaim: selectDefaultChannelClaim(state),
});

const perform = {
  fetchChannelListMine: doFetchChannelListMine,
  fetchCollectionListMine: doFetchCollectionListMine,
  setLanguage: doSetLanguage,
  signIn: doSignIn,
  syncLoop: doSyncLoop,
  setReferrer: doUserSetReferrer,
  setIncognito: doSetIncognito,
  fetchModBlockedList: doFetchModBlockedList,
  fetchModAmIList: doFetchCommentModAmIList,
  doOpenAnnouncements,
  doSetLastViewedAnnouncement,
  doSetDefaultChannel,
};

export default hot(connect(select, perform)(App));