import { defineStore } from "pinia";
import type { User } from "@/client/auth";
import { UserService, RoleEnum } from "@/client/auth";
import { S3KeyService } from "@/client/s3proxy";
import type { S3Key } from "@/client/s3proxy";
import { OpenAPI as S3ProxyOpenAPI } from "@/client/s3proxy";
import { OpenAPI as AuthOpenAPI } from "@/client/auth";
import { OpenAPI as WorkflowOpenAPI } from "@/client/workflow";

export type RootState = {
  token: string | null;
  user: User | null;
  s3key: S3Key | null;
};

export const useAuthStore = defineStore({
  id: "auth",
  state: () =>
    ({
      token: null,
      user: null,
      s3key: null,
    } as RootState),
  getters: {
    authenticated: (state) => state.token != null,
    foreignUser: (state) =>
      state.user?.roles?.includes(RoleEnum.FOREIGN_USER) ?? true,
    normalUser: (state) => state.user?.roles?.includes(RoleEnum.USER) ?? false,
    workflowReviewer: (state) =>
      state.user?.roles?.includes(RoleEnum.REVIEWER) ?? false,
    workflowDev: (state) =>
      state.user?.roles?.includes(RoleEnum.DEVELOPER) ?? false,
    admin: (state) =>
      state.user?.roles?.includes(RoleEnum.ADMINISTRATOR) ?? false,
  },
  actions: {
    setToken(token: string | null) {
      if (token != null) {
        S3ProxyOpenAPI.TOKEN = token;
        AuthOpenAPI.TOKEN = token;
        WorkflowOpenAPI.TOKEN = token;
        this.token = token;
        UserService.userGetLoggedInUser()
          .then((user) => {
            this.updateUser(user);
          })
          .catch(() => {
            this.token = null;
          });
      } else {
        this.token = null;
        this.user = null;
      }
    },
    setS3Key(key: S3Key | null) {
      this.s3key = key;
    },
    updateUser(user: User) {
      this.user = user;
      S3KeyService.s3KeyGetUserKeys(user.uid)
        .then((keys) => {
          if (keys.length > 0) {
            this.setS3Key(keys[0]);
          } else {
            this.setS3Key(null);
          }
        })
        .catch(() => {
          this.setS3Key(null);
        });
    },
    logout() {
      this.setToken(null);
    },
  },
});