import { PermissionsMap } from "./map";

class UserPermissions {
  private _permissions: string;

  constructor({ permissions }: { permissions: string }) {
    this._permissions = permissions;
  }

  private isBitSet(hexValue: string, bitPosition: number): boolean {
    if (hexValue === undefined || hexValue === null || hexValue === "") {
      return false;
    }

    const num: bigint = BigInt("0x" + hexValue);
    const bitMask: bigint = BigInt(1) << BigInt(bitPosition);
    return (num & bitMask) !== BigInt(0);
  }

  public canUploadProject(): boolean {
    return this.isBitSet(this._permissions, PermissionsMap.UPLOAD_PROJECT);
  }

  public canDeleteProject(): boolean {
    return this.isBitSet(this._permissions, PermissionsMap.DELETE_PROJECT);
  }

  public canUploadFiles(): boolean {
    return this.isBitSet(this._permissions, PermissionsMap.UPLOAD_FILES);
  }

  public canEditFile(): boolean {
    return this.isBitSet(this._permissions, PermissionsMap.EDIT_FILE);
  }

  public canViewUserList(): boolean {
    return this.isBitSet(this._permissions, PermissionsMap.VIEW_USER_LIST);
  }

  public canCreateProfile(): boolean {
    return this.isBitSet(this._permissions, PermissionsMap.CREATE_USER);
  }

  public canViewProfile(): boolean {
    return this.isBitSet(this._permissions, PermissionsMap.VIEW_USER);
  }

  public canUpdateProfile(): boolean {
    return this.isBitSet(this._permissions, PermissionsMap.UPDATE_USER);
  }

  public canDeleteProfile(): boolean {
    return this.isBitSet(this._permissions, PermissionsMap.DELETE_USER);
  }

  public canMakeAll(): boolean {
    return this.isBitSet(this._permissions, PermissionsMap.ALL);
  }
}

export { PermissionsMap, UserPermissions };
