import { boot } from 'quasar/wrappers';
import { StateInterface } from 'src/store';
import { RouteRecord } from 'vue-router';
import { Store } from 'vuex';

export default boot<Store<StateInterface>>(({ router, store }) => {
  router.beforeEach((to, from, next) => {
    const user = store.state.user.currentUser;
    const session = store.state.session.currentSession;

    let permissions: string[] = [];
    if (user) {
      user.roles.forEach(role => {
        permissions = permissions.concat(role.permissions);
      });
    }

    if (to.name != 'login') {
      if (!session || session.expires <= new Date()) {
        store.dispatch('session/logout').catch(error => {
          console.warn(error);
        });
        return next({ name: 'login', query: { redirect: to.fullPath } });
      }

      if (
        to.matched.every((record: RouteRecord) => {
          if (!('meta' in record) || !('permissions' in record.meta))
            return true;
          if (record.meta) {
            if ((<{ permissions: FG.Permission[] }>record.meta).permissions) {
              return (<{ permissions: FG.Permission[] }>(
                record.meta
              )).permissions.every((permission: string) => {
                return permissions.includes(permission);
              });
            }
          }
        })
      ) {
        next();
      } else {
        next({ name: 'login', query: { redirect: to.fullPath } });
      }
    } else {
      next();
    }
  });
});