import config from 'src/config';
import { boot } from 'quasar/wrappers';
import { LocalStorage, Notify } from 'quasar';
import axios, { AxiosError } from 'axios';
import { useMainStore } from 'src/store';

const api = axios.create();

export default boot(({ router }) => {
  api.defaults.baseURL = LocalStorage.getItem<string>('baseURL') || config.baseURL;

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

  /***
   * Intercept responses
   *   - filter 401 --> logout
   *   - filter timeout or 502-504 --> backendOffline
   */
  api.interceptors.response.use(
    (response) => response,
    async (error) => {
      const store = useMainStore();

      if (error) {
        const e = <AxiosError>error;
        const current = router.currentRoute.value;
        if (
          e.code === 'ECONNABORTED' ||
          (e.response && e.response.status >= 502 && e.response.status <= 504)
        ) {
          let next = current.path;
          if ((current.name == 'login' || current.name == 'offline') && current.query.redirect)
            next = <string>current.query.redirect;
          await router.push({
            name: 'offline',
            query: { redirect: next },
          });
        } else if (e.response && e.response.status == 401) {
          void store.logout();
          if (current.name !== 'login') {
            await router.push({
              name: 'login',
              params: { logout: 'logout' },
              query: { redirect: current.path },
            });
          }
        }
      }
      throw error;
    }
  );
});

export { api };

export const setBaseURL = (url: string) => {
  LocalStorage.set('baseURL', url);
  api.defaults.baseURL = url;
  Notify.create({
    message: 'Serveraddresse gespeichert',
    position: 'bottom',
    caption: `${url}`,
    color: 'positive',
  });
  setTimeout(() => {
    window.location.reload();
  }, 5000);
};