import { observable, action, computed} from 'mobx';
import * as fetch from 'isomorphic-fetch';

export class Authentication {

  @observable isLoading = false;
  @observable isRegistering = false;
  @observable isLoggingIn = false;
  @observable isInviting = false;
  @observable removingUser = false;

  @observable userWallet = {};
  @observable userProfile = {
    email : '',
    role : '',
    username : '',
    status :'',
    agent : {
      name : '',
      phone_number : '',
      email : '',
      address : '',
      id: '',
      created_at: '',
      user_id:'',
      id_tax_number : '',
      id_type : '',
      id_number : '',
      id_photo : '',
      passport_number: '',
      passport_photo : '',
      error_email : '',
    },
    // role_data: {
    //   airline_blacklisteds: [],
    //   airline_settings: []
    // }
  };

  constructor(context) {
    this.context = context;
    this.http = context.http;
  }

  @action
  login(data) {
    // this.context.setToken('eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJkaWdpc3VpdGVzIiwiZXhwIjoxNDg1ODcyMTYzLCJzdWIiOiJjcmVkZW50aWFsIiwidXNlciI6Imhhc3RhLnJhZ2lsQGdtYWlsLmNvbSIsInJvbGVzIjpbIlRyYXZlbCBBZ2VudCJdfQ.u3MEelOz3FWyP78QLTvTh4n-ueH1G4R0GWcXrjXUPMY');
    this.isLoggingIn = true;

    return this.http.post("authentication/login", data)
      .then(res => {
        this.isLoggingIn = false;
        this.context.setToken(res.token);
        this.context.loadDataAfterLogin();
      })
      .catch(err => {
        this.isLoggingIn = false;
        throw err;
      })
  }

  @action
  forgetPassword(email) {
    return this.http.post("authentication/forgot_password", email)
      .then(res => {
        return res;
      })
      .catch(err => {
        throw err;
      })
  }

  @action
  logout() {
    this.context.setToken("");
    this.context.setUserData({});
    // return this.http.post("authentication/logout", {token : localStorage.getItem('tokens')})
    // .then(res => {
    //   this.context.setToken("");
    //   this.context.setUserData({});
    //
    //   localStorage.removeItem('id_token');
    //   localStorage.removeItem('user.name');
    //   localStorage.removeItem('user.profile_image');
    //   localStorage.setItem('isLoggingIn', false);
    //   let cookies = document.cookie.split(";");
    //   for (let i = 0; i < cookies.length; i++) {
    //     this.eraseCookie(cookies[i].split("=")[0]);
    //   }
    //
    //   if (window && window.Tawk_API && window.Tawk_API.isChatHidden()) {
    //     window.Tawk_API.hideWidget()
    //   }
    //
    //   return res;
    // })
    // .catch(err => {
    //   throw err;
    // })

  }

  @action
  register(data) {
    this.isRegistering = true;
    return this.http.post("register", data)
      .then(res => {
        this.isRegistering = false;
        return res;
      })
      .catch(err => {
        this.isRegistering = false;
        throw err;
      })
  }

  createCookie(name,value,days) {
    let expires
    if (days) {
      let date = new Date();
      date.setTime(date.getTime()+(days*24*60*60*1000));
      let expires = "; expires="+date.toGMTString();
    }
    else {
      let expires = "";
    }
    document.cookie = name+"="+value+expires+"; path=/";
  }

  @action
  changePassword(data){
    return this.http.post(`authentication/reset_password`,{password : data.password,old_password : data.old_password,id : this.userProfile.id})
      .then(res=>{
        return res;
      })
  }

  eraseCookie(name) {
    this.createCookie(name,"",-1);
  }

  invite(email) {
    this.isInviting = true;
    return this.http.post(`invite_user`, {email})
      .then(res => {
        this.isInviting = false;
        return res;
      })
  }

  removeUserFromEntity(id) {
    this.removingUser = true;
    return this.http.post('remove_user_from_entity', {id})
      .then(res => {
        this.removingUser = false;

        return res;
      })
  }

  inviteUserToEntity(email, roleId, entityId) {
    this.isInviting = true;
    return this.http.post(`invite_user_to_entity_or_project`, {email, role_id: roleId, entity_id: entityId})
    .then(res => {
      this.isInviting = false;
      return res;
    })
  }

  inviteUserToProject(email, roleId, entityId, projectId) {
    this.isInviting = true;
    return this.http.post(`invite_user_to_entity_or_project`, {email, role_id: roleId, entity_id: entityId, project_id: projectId})
    .then(res => {
      this.isInviting = false;
      return res;
    })
  }

  @action
  acceptInvite(token, password) {
    return this.http.post('invite_user_accept', {token, password});
  }

  @action
  getProfile() {
    // console.log('get profile nih');
    this.isLoading = true;
    return this.http.get('profile')
      .then(res => {
        this.userProfile.username = res.user.username;
        this.userProfile.role = res.user.type.name;
        this.isLoading = false;
        // this.userProfile = res;
      })
      .catch(err => {
        this.isLoading = false;
        throw err;
      })
  }

  @action
  updateProfile() {
    this.isLoading = true;
    return this.http.put('profile', this.userProfile.agent)
      .then(res => this.getProfile())
      .catch(err => {
        this.isLoading = false;
        throw err;
      })
  }

  @action
  getWallet() {
    this.isLoading = true;
    return this.http.get("wallet")
      .then(res => {
        this.userWallet = res;
        this.isLoading = false;
      })
      .catch(err => {
        this.isLoading = false;
        throw err;
      })
  }

  @action
  checkEmailAvaliability(data){
    return this.http.get(`users?email=${data}`)
      .then(res=>{
        if(res.length == 0){
          return true;
        }
        else{
          return false
        }
      })
  }

  @action
  checkUsernameAvaliability(data){
    return this.http.get(`users?username=${data}`)
      .then(res=>{
        if(res.length == 0){
          return true;
        }
        else{
          return false
        }
      })
  }

  @computed
  get isLoggedIn() {
    // alert(!!(this.context.token));
    return !!(this.context.token);
  }

  toJson() {
    return {
      items: this.items
    };
  }
}

