import {
  BOOKING_READ,
  BOOKING_WRITE,
  EVENT_TYPE_READ,
  EVENT_TYPE_WRITE,
  PERMISSIONS,
  SCHEDULE_READ,
  SCHEDULE_WRITE,
  APPS_READ,
  APPS_WRITE,
  PROFILE_READ,
  PROFILE_WRITE,
} from "@calcom/platform-constants";
import type { PLATFORM_PERMISSION } from "@calcom/platform-types";

export const hasPermission = (userPermissions: number, permission: PLATFORM_PERMISSION): boolean => {
  // use bitwise AND to check if user has the permission
  return (userPermissions & permission) === permission;
};

export const hasPermissions = (userPermissions: number, permissions: PLATFORM_PERMISSION[]): boolean => {
  // use bitwise AND to check if each required permission is present
  return permissions.every((permission) => hasPermission(userPermissions, permission));
};

export const hasEventTypeReadPermission = (userPermissions: number): boolean => {
  return hasPermission(userPermissions, EVENT_TYPE_READ);
};

export const hasEventTypeWritePermission = (userPermissions: number): boolean => {
  return hasPermission(userPermissions, EVENT_TYPE_WRITE);
};

export const hasBookingReadPermission = (userPermissions: number): boolean => {
  return hasPermission(userPermissions, BOOKING_READ);
};

export const hasBookingWritePermission = (userPermissions: number): boolean => {
  return hasPermission(userPermissions, BOOKING_WRITE);
};

export const hasScheduleReadPermission = (userPermissions: number): boolean => {
  return hasPermission(userPermissions, SCHEDULE_READ);
};

export const hasScheduleWritePermission = (userPermissions: number): boolean => {
  return hasPermission(userPermissions, SCHEDULE_WRITE);
};

export const hasAppsReadPermission = (userPermissions: number): boolean => {
  return hasPermission(userPermissions, APPS_READ);
};

export const hasAppsWritePermission = (userPermissions: number): boolean => {
  return hasPermission(userPermissions, APPS_WRITE);
};

export const hasProfileReadPermission = (userPermissions: number): boolean => {
  return hasPermission(userPermissions, PROFILE_READ);
};

export const hasProfileWritePermission = (userPermissions: number): boolean => {
  return hasPermission(userPermissions, PROFILE_WRITE);
};

export const listPermissions = (userPermissions: number): PLATFORM_PERMISSION[] => {
  return PERMISSIONS.reduce((acc, permission) => {
    if (hasPermission(userPermissions, permission)) {
      return [...acc, permission];
    }
    return acc;
  }, [] as PLATFORM_PERMISSION[]);
};
