<script setup lang="ts">
import type { TokenInjectType } from "@/api";
import { inject, onBeforeMount, ref } from "vue";
import { Responses, check_token, Admin, isErrorResponse } from "@/api";
import { onBeforeRouteUpdate } from "vue-router";
import router from "@/router";

const jwt = inject<TokenInjectType>("jwt") as TokenInjectType;

const users = ref<Responses.Admin.GetUsersEntry[]>([]);

onBeforeRouteUpdate(async () => {
  await updatePanel();
});
onBeforeMount(async () => {
  await updatePanel();
});
async function updatePanel() {
  const token = await check_token(jwt);
  if (!token) return;

  const res = await Admin.get_users(token);
  if (isErrorResponse(res)) return router.replace({ path: "/" });
  users.value = res.users;
}

async function setRole(user: number, roleStr: string) {
  const token = await check_token(jwt);
  if (!token) return;

  const res = await Admin.set_role(user, parseInt(roleStr, 10), token);
  if (isErrorResponse(res)) console.error(res.message);
  await updatePanel();
}

async function disableTfa(user: number) {
  const token = await check_token(jwt);
  if (!token) return;

  const res = await Admin.disable_tfa(user, token);
  if (isErrorResponse(res)) console.error(res.message);
  await updatePanel();
}

async function logoutUser(user: number) {
  const token = await check_token(jwt);
  if (!token) return;

  const res = await Admin.logout(user, token);
  if (isErrorResponse(res)) console.error(res.message);
  await updatePanel();
}

async function deleteUser(user: number) {
  const token = await check_token(jwt);
  if (!token) return;

  const res = await Admin.delete_user(user, token);
  if (isErrorResponse(res)) console.error(res.message);
  await updatePanel();
}
</script>

<template>
  <table>
    <tr>
      <th>Name</th>
      <th>Type</th>
      <th>Role</th>
      <th>Tfa Status</th>
      <th>Actions</th>
    </tr>
    <tr v-for="user in users" :key="user.id">
      <td>{{ user.name }}</td>
      <td>{{ user.gitlab ? "Gitlab" : "Password" }}</td>
      <td>
        <select @change="setRole(user.id, ($event.target as HTMLSelectElement).value)">
          <option value="0" :selected="user.role === 0 ? true : undefined">
            Disabled
          </option>
          <option value="1" :selected="user.role === 1 ? true : undefined">
            User
          </option>
          <option value="2" :selected="user.role === 2 ? true : undefined">
            Admin
          </option>
        </select>
      </td>
      <td v-if="user.gitlab"></td>
      <td v-else>
        {{ user.tfaEnabled ? "Enabled" : "Disabled" }}
      </td>
      <td>
        <button v-if="user.tfaEnabled" @click="disableTfa(user.id)">
          Disable Tfa
        </button>
        <button @click="logoutUser(user.id)">Logout all</button>
        <button @click="deleteUser(user.id)">Delete</button>
      </td>
    </tr>
  </table>
</template>

<style scoped></style>