import Vue from 'vue';
import Overlay from 'zero/helpers/overlay.js';
import { find as _find, extend as _extend } from 'underscore';
import Axios from 'axios';
//import PasswordChangeOverlay from 'zero/pages/password-change.vue';

export default new Vue({

  data: () => ({
    isAuthenticated: false,
    rejectReason: null,
    user: {
      name: null,
      email: null
    }
  }),

  watch: {
    isAuthenticated(value)
    {
      this.$emit('authenticated', value);
    },
    user(value)
    {
      this.$emit('user', value);
    }
  },

  methods: {

    // loads the current user into the cache
    loadUser()
    {
      Axios.get('authentication/getUser').then(res =>
      {
        this.isAuthenticated = res.data.success && res.data.model;

        if (res.data.success)
        {
          this.user = res.data.model;
        }
      });
    },

    // the cached user has been rejected by the server so we clear credentials here
    rejectUser(reason)
    {
      this.rejectReason = reason;
      this.isAuthenticated = false;
      this.user = null;
    },

    // sets the current user and isAuthenticated to true
    setUser(user)
    {
      if (!user)
      {
        this.rejectUser();
        return;
      }
      this.isAuthenticated = true;
      this.user = user;
    },

    // logs the user in with the passed credentials
    login(model)
    {
      return Axios.post('authentication/loginUser', model).then(res =>
      {
        return new Promise((resolve, reject) =>
        {
          if (res.data.success)
          {
            this.setUser(res.data.model);
            resolve(res.data);
          }
          else
          {
            this.rejectUser();
            reject(res.data.errors);
          }
        });
      });
    },

    // logs the current user out
    logout()
    {
      let promise = Axios.post('authentication/logoutUser');
      this.rejectUser("@login.rejectReasons.logout");
      return promise;
    },

    // try to switch selected application for user
    switchApp(appId)
    {
      return Axios.post('authentication/switchApp', null, { params: { appId } }).then(res =>
      {
        //return this.zero.reloadConfig().then(() =>
        //{
          this.$emit('appswitch', res.data);
          return Promise.resolve(res.data.success);
        //});
      });
    },

    // open overlay to update password
    openPasswordOverlay()
    {
      return Overlay.open({
        title: '@changepasswordoverlay.title',
        closeLabel: '@ui.close',
        confirmLabel: '@changepasswordoverlay.confirm',
        component: PasswordChangeOverlay
      });
    }
  }
});