//import * as Analytics from "expo-firebase-analytics";//JF:commenting out the firebase analytics portion
import { signInWithEmailAndPassword, signOut } from "firebase/auth";
import { all, call, put, takeLatest } from "redux-saga/effects";
import { logImEXEvent } from "../../firebase/firebase.analytics";
import {
  auth,
  getCurrentUser,
  updateCurrentUser,
} from "../../firebase/firebase.utils";
import { QUERY_BODYSHOP } from "../../graphql/bodyshop.queries";
import { client } from "../../graphql/client";
import {
  sendPasswordResetFailure,
  sendPasswordResetSuccess,
  setBodyshop,
  signInFailure,
  signInSuccess,
  signOutFailure,
  signOutSuccess,
  unauthorizedUser,
  updateUserDetailsSuccess,
  validatePasswordResetFailure,
  validatePasswordResetSuccess,
} from "./user.actions";
import UserActionTypes from "./user.types";

export function* onEmailSignInStart() {
  yield takeLatest(UserActionTypes.EMAIL_SIGN_IN_START, signInWithEmail);
}
export function* signInWithEmail({ payload: { email, password } }) {
  try {
    logImEXEvent("imexmobile_sign_in_attempt", { user: email });
    const { user } = yield signInWithEmailAndPassword(auth, email, password);
    yield put(
      signInSuccess({
        uid: user.uid,
        email: user.email,
        displayName: user.displayName,
        photoURL: user.photoURL,
        authorized: true,
      })
    );
  } catch (error) {
    yield put(signInFailure(error));

    //logImEXEvent("redux_sign_in_failure", { user: email, error });
  }
}

export function* onCheckUserSession() {
  yield takeLatest(UserActionTypes.CHECK_USER_SESSION, isUserAuthenticated);
}
export function* isUserAuthenticated() {
  try {
    //logImEXEvent("redux_auth_check");

    const user = yield getCurrentUser();
    if (!user) {
      yield put(unauthorizedUser());
      return;
    }

    yield put(
      signInSuccess({
        uid: user.uid,
        email: user.email,
        displayName: user.displayName,
        photoURL: user.photoURL,
        authorized: true,
      })
    );
  } catch (error) {
    yield put(signInFailure(error));
  }
}
export function* onSignOutStart() {
  yield takeLatest(UserActionTypes.SIGN_OUT_START, signOutStart);
}
export function* signOutStart() {
  try {
    logImEXEvent("imexmobile_sign_out");

    yield signOut(auth);
    yield put(signOutSuccess());
  } catch (error) {
    yield put(signOutFailure(error.message));
  }
}

export function* onUpdateUserDetails() {
  yield takeLatest(UserActionTypes.UPDATE_USER_DETAILS, updateUserDetails);
}
export function* updateUserDetails(userDetails) {
  try {
    yield updateCurrentUser(userDetails.payload);
    yield put(updateUserDetailsSuccess(userDetails.payload));
  } catch (error) {
    //yield put(signOutFailure(error.message));
    //TODO error handling
  }
}

export function* onSignInSuccess() {
  yield takeLatest(UserActionTypes.SIGN_IN_SUCCESS, signInSuccessSaga);
}

export function* signInSuccessSaga({ payload }) {
  try {
    const shop = yield client.query({ query: QUERY_BODYSHOP });
    logImEXEvent("imexmobile_sign_in_success", payload);

    yield put(setBodyshop(shop.data.bodyshops[0]));
    // yield put(
    //   setBodyshop({
    //     ...shop.data.bodyshops[0],
    //     uselocalmediaserver: true,
    //     localmediaserverhttp: `http://192.168.1.235:8000`,
    //   })
    // );
  } catch (error) {
    console.log("UH-OH. Couldn't get shop details.", error);

  }
}

export function* onSendPasswordResetStart() {
  yield takeLatest(
    UserActionTypes.SEND_PASSWORD_RESET_EMAIL_START,
    sendPasswordResetEmail
  );
}
export function* sendPasswordResetEmail({ payload }) {
  try {
    yield auth.sendPasswordResetEmail(payload, {
      url: "https://imex.online/passwordreset",
    });
    yield put(sendPasswordResetSuccess());
  } catch (error) {
    yield put(sendPasswordResetFailure(error.message));
  }
}

export function* onValidatePasswordResetStart() {
  yield takeLatest(
    UserActionTypes.VALIDATE_PASSWORD_RESET_START,
    validatePasswordResetStart
  );
}
export function* validatePasswordResetStart({ payload: { password, code } }) {
  try {
    yield auth.confirmPasswordReset(code, password);
    yield put(validatePasswordResetSuccess());
  } catch (error) {
    yield put(validatePasswordResetFailure(error.message));
  }
}

export function* userSagas() {
  yield all([
    call(onEmailSignInStart),
    call(onCheckUserSession),
    call(onSignOutStart),
    call(onUpdateUserDetails),

    call(onSignInSuccess),
    call(onSendPasswordResetStart),
    call(onValidatePasswordResetStart),
  ]);
}
