import axios, { AxiosInstance, AxiosError } from 'axios';
import { boot } from 'quasar/wrappers';
import config from '../config';
import { Store } from 'vuex';
import { StateInterface } from 'src/store';

declare module 'vue/types/vue' {
  interface Vue {
    $axios: AxiosInstance;
  }
}

export default boot<Store<StateInterface>>(({ Vue, store }) => {
  // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
  Vue.prototype.$axios = axios;
  axios.defaults.baseURL = config.baseURL;

  /***
   * Intercept requests and insert Token if available
   */
  axios.interceptors.request.use(config => {
    const session = store.state.session.currentSession;
    if (session?.token) {
      config.headers = { Authorization: 'Bearer ' + session.token };
    }
    return config;
  });

  /***
   * Intercept responses, filter 401 and logout
   */
  axios.interceptors.response.use(
    response => response,
    error => {
      if (error && 'response' in error) {
        const e = <AxiosError>error;
        if (e.response && e.response.status == 401) {
          return store.dispatch('session/clearup');
        }
      }
      return Promise.reject(error);
    }
  );
});

export { axios };