<template>
  <div>
    <q-tabs v-model="tab" v-if="$q.screen.gt.sm">
      <q-tab
        v-for="(tabindex, index) in tabs"
        :key="'tab' + index"
        :name="tabindex.name"
        :label="tabindex.label"
      />
    </q-tabs>
    <div class="fit row justify-end" v-else>
      <q-btn flat round icon="mdi-menu" @click="showDrawer = !showDrawer" />
    </div>
    <q-drawer
      side="right"
      v-model="showDrawer"
      @click="showDrawer = !showDrawer"
      behavior="mobile"
    >
      <q-list v-model="tab">
        <q-item
          v-for="(tabindex, index) in tabs"
          :key="'tab' + index"
          :active="tab == tabindex.name"
          clickable
          @click="tab = tabindex.name"
        >
          <q-item-label>{{ tabindex.label }}</q-item-label>
        </q-item>
      </q-list>
    </q-drawer>
    <q-page
      padding
      class="fit row justify-center content-start items-start q-gutter-sm"
    >
      <q-tab-panels
        v-model="tab"
        style="background-color: transparent;"
        class="q-ma-none q-pa-none fit row justify-center content-start items-start"
        animated
      >
        <q-tab-panel name="user">
          <UpdateUser />
        </q-tab-panel>
        <q-tab-panel name="newUser">
          <NewUser />
        </q-tab-panel>
        <q-tab-panel name="roles">
          <RoleSettings v-if="canEditRoles" />
        </q-tab-panel>
      </q-tab-panels>
    </q-page>
  </div>
</template>

<script lang="ts">
import {
  computed,
  defineComponent,
  onBeforeMount,
  ref
} from '@vue/composition-api';
import RoleSettings from '../components/settings/RoleSettings.vue';
import UpdateUser from '../components/UpdateUser.vue';
import NewUser from '../components/NewUser.vue';
import { Store } from 'vuex';
import { StateInterface } from 'src/store';
import { hasPermission } from 'src/components/permission';
import { PERMISSIONS } from '../permissions';
import { Screen } from 'quasar';

export default defineComponent({
  name: 'AdminSettings',
  components: { RoleSettings, UpdateUser, NewUser },
  setup(_, { root }) {
    const store = <Store<StateInterface>>root.$store;

    onBeforeMount(() => {
      store.dispatch('user/getUsers').catch(error => console.warn(error));
    });

    const canEditRoles = computed(() =>
      hasPermission(PERMISSIONS.ROLES_EDIT, store)
    );

    interface Tab {
      name: string;
      label: string;
    }

    const tabs: Tab[] = [
      { name: 'user', label: 'Mitglieder' },
      { name: 'newUser', label: 'Neues Mitglied' },
      { name: 'roles', label: 'Rollen' }
    ];

    const drawer = ref<boolean>(false);

    const showDrawer = computed({
      get: () => {
        return !Screen.gt.sm && drawer.value;
      },
      set: (val: boolean) => {
        drawer.value = val;
      }
    });

    const tab = ref<string>('user');

    return {
      canEditRoles,
      showDrawer,
      tab,
      tabs
    };
  }
});
</script>
