import { observable, action, computed } from 'mobx';
import { browserHistory } from 'react-router';
import { client } from 'utils/ApiClient';

const USER_STORE = 'USER_STORE';

class UserStore {
  @observable user;
  @observable team;

  @observable token;
  @observable oauthState;

  @observable isLoading;

  /* Computed */

  @computed get authenticated() {
    return !!this.token;
  }

  @computed get asJson() {
    return JSON.stringify({
      user: this.user,
      team: this.team,
      token: this.token,
      oauthState: this.oauthState,
    });
  }

  /* Actions */

  @action logout = () => {
    this.user = null;
    this.token = null;
    browserHistory.push('/');
  };

  @action getOauthState = () => {
    const state = Math.random().toString(36).substring(7);
    this.oauthState = state;
    return this.oauthState;
  }

  @action authWithSlack = async (code, state) => {
    if (state !== this.oauthState) {
      browserHistory.push('/auth-error');
      return;
    }

    let res;
    try {
      res = await client.post('/auth.slack', { code: code });
    } catch (e) {
      browserHistory.push('/auth-error');
      return;
    }

    this.user = res.data.user;
    this.team = res.data.team;
    this.token = res.data.accessToken;
    browserHistory.replace('/dashboard');
  }

  constructor() {
    // Rehydrate
    const data = JSON.parse(localStorage.getItem(USER_STORE)) || {};
    this.user = data.user;
    this.team = data.team;
    this.token = data.token;
    this.oauthState = data.oauthState;
  }
};

export default UserStore;
export {
  USER_STORE,
};
