import InifniBadRequestException from 'src/common/exceptions/infini-badrequest-exception';
import { ERROR_CODES } from 'src/common/constants/error-string-constants';

/**
 * Enum for program access check type
 */
export enum ProgramAccessCheckType {
  VIEW = 'view',
  REGISTER = 'register',
}

/**
 * Extract role keys from the request user object
 * @param req - Express request object with user
 * @returns Array of role keys (e.g., ['ROLE_ADMIN', 'ROLE_VIEWER'])
 */
export function extractUserRoleKeys(req: any): string[] {
  if (!req?.user?.userRoleMaps) {
    return [];
  }
  
  return req.user.userRoleMaps
    .filter((urm: any) => urm?.role?.roleKey)
    .map((urm: any) => urm.role.roleKey);
}

/**
 * Throws an exception if access is denied
 * @param hasAccess - Boolean indicating if user has access
 * @param programId - Program ID for logging
 * @param accessType - ProgramAccessCheckType (VIEW or REGISTER)
 */
export function throwIfAccessDenied(
  hasAccess: boolean,
  programId: number,
  accessType: ProgramAccessCheckType = ProgramAccessCheckType.VIEW,
): void {
  if (!hasAccess) {
    const errorCode = accessType === ProgramAccessCheckType.REGISTER
      ? ERROR_CODES.PROGRAM_REGISTRATION_ACCESS_DENIED
      : ERROR_CODES.PROGRAM_ACCESS_DENIED;

    throw new InifniBadRequestException(
      errorCode,
      null,
      `You do not have access to ${accessType === ProgramAccessCheckType.REGISTER ? 'register for' : 'view'} program ${programId}`,
    );
  }
}
