import { UserInfo } from 'firebase';
import { AsyncStorage } from 'react-native';
import * as API from '../../api';
import { AuthStatusActionCreator, Dispatch, ActionType } from '..';
import { AuthStatus } from '../../data-types';
import { pullUserInfoFromLocalDBToRedux } from '../helpers';
import { downloadUserInfoToLocalDB } from './userInfo';

const setAuthStatusToSignedIn: AuthStatusActionCreator = userInfo => ({
  type: ActionType.SET_AUTH_STATUS,
  payload: { status: AuthStatus.SignedIn, userInfo },
});

const setAuthStatusToSignedOut: AuthStatusActionCreator = () => ({
  type: ActionType.SET_AUTH_STATUS,
  payload: { status: AuthStatus.SignedOut },
});

export const subscribeToAuthStateChange = () => (dispatch: Dispatch) => {
  API.initialize();

  return API.requestAuthStateListener((async (user: UserInfo) => {
    if (!user) {
      // Case 1: Signed out
      await Promise.all([
        AsyncStorage.removeItem('wellbeing'),
        AsyncStorage.removeItem('locationLastUpdatedAt'),
        AsyncStorage.removeItem('lastMapCenter'),
      ]);

      return dispatch(setAuthStatusToSignedOut());
    }

    // Case 2: Signed in
    const userInfo = {
      email: user.email,
      uid: user.uid,
    };

    await downloadUserInfoToLocalDB(user.uid);
    await pullUserInfoFromLocalDBToRedux(dispatch);
    return dispatch(setAuthStatusToSignedIn(userInfo));
  }) as any);
};