// mobx
import { action, observable, computed, runInAction, makeObservable } from "mobx";
// services
import UserService from "services/user.service";
// interfaces
import { ICurrentUser, ICurrentUserSettings } from "types/users";

class UserStore {
  currentUser: ICurrentUser | null = null;
  currentUserSettings: ICurrentUserSettings | null = null;
  // root store
  rootStore;

  constructor(_rootStore: any) {
    makeObservable(this, {
      // observable
      currentUser: observable.ref,
      currentUserSettings: observable.ref,
      // action
      setCurrentUser: action,
      setCurrentUserSettings: action,
      updateCurrentUser: action,
      updateCurrentUserSettings: action,
      // computed
    });
    this.rootStore = _rootStore;
    this.initialLoad();
  }

  setCurrentUser = async () => {
    try {
      let userResponse: ICurrentUser | null = await UserService.currentUser();
      userResponse = userResponse || null;

      if (userResponse) {
        const userPayload: ICurrentUser = {
          id: userResponse?.id,
          avatar: userResponse?.avatar,
          first_name: userResponse?.first_name,
          last_name: userResponse?.last_name,
          username: userResponse?.username,
          email: userResponse?.email,
          mobile_number: userResponse?.mobile_number,
          is_email_verified: userResponse?.is_email_verified,
          is_tour_completed: userResponse?.is_tour_completed,
          onboarding_step: userResponse?.onboarding_step,
          is_onboarded: userResponse?.is_onboarded,
          role: userResponse?.role,
        };
        runInAction(() => {
          this.currentUser = userPayload;
        });
      }
    } catch (error) {
      console.error("Fetching current user error", error);
    }
  };

  setCurrentUserSettings = async () => {
    try {
      let userSettingsResponse: ICurrentUserSettings | null = await UserService.currentUser();
      userSettingsResponse = userSettingsResponse || null;

      if (userSettingsResponse) {
        const themePayload = {
          theme: { ...userSettingsResponse?.theme },
        };
        runInAction(() => {
          this.currentUserSettings = themePayload;
          this.rootStore.theme.setTheme(themePayload);
        });
      }
    } catch (error) {
      console.error("Fetching current user error", error);
    }
  };

  updateCurrentUser = async (user: ICurrentUser) => {
    try {
      let userResponse: ICurrentUser = await UserService.updateUser(user);
      userResponse = userResponse || null;

      if (userResponse) {
        const userPayload: ICurrentUser = {
          id: userResponse?.id,
          avatar: userResponse?.avatar,
          first_name: userResponse?.first_name,
          last_name: userResponse?.last_name,
          username: userResponse?.username,
          email: userResponse?.email,
          mobile_number: userResponse?.mobile_number,
          is_email_verified: userResponse?.is_email_verified,
          is_tour_completed: userResponse?.is_tour_completed,
          onboarding_step: userResponse?.onboarding_step,
          is_onboarded: userResponse?.is_onboarded,
          role: userResponse?.role,
        };
        runInAction(() => {
          this.currentUser = userPayload;
        });
        return userPayload;
      }
    } catch (error) {
      console.error("Updating user error", error);
      return error;
    }
  };

  updateCurrentUserSettings = async (userTheme: ICurrentUserSettings) => {
    try {
      let userSettingsResponse: ICurrentUserSettings = await UserService.updateUser(userTheme);
      userSettingsResponse = userSettingsResponse || null;
      if (userSettingsResponse) {
        const themePayload = {
          theme: { ...userSettingsResponse?.theme },
        };
        runInAction(() => {
          this.currentUserSettings = themePayload;
          this.rootStore.theme.setTheme(themePayload);
        });
        return themePayload;
      }
    } catch (error) {
      console.error("Updating user settings error", error);
      return error;
    }
  };

  // init load
  initialLoad() {}
}

export default UserStore;