/*
 * Copyright 2022 Google LLC
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef THIRD_PARTY_ECCLESIA_LIB_REDFISH_AUTHORIZER_ENUMS_H_
#define THIRD_PARTY_ECCLESIA_LIB_REDFISH_AUTHORIZER_ENUMS_H_

#include <cstdint>
#include <string>

#include "absl/strings/string_view.h"

namespace ecclesia {

enum class ResourceEntity : int {
  // go/keep-sorted start
  kAccelerationFunction = 0,
  kAccelerationFunctionCollection,
  kAccountService,
  kActionInfo,
  kAddressPool,
  kAddressPoolCollection,
  kAggregate,
  kAggregateCollection,
  kAggregationService,
  kAggregationSource,
  kAggregationSourceCollection,
  kAllowDeny,
  kAllowDenyCollection,
  kAmdPostPackageRepair,
  kAmdPostPackageRepairConfig,
  kAmdPostPackageRepairStatus,
  kAssembly,
  kBattery,
  kBatteryCollection,
  kBatteryMetrics,
  kBios,
  kBootOption,
  kBootOptionCollection,
  kCXLLogicalDevice,
  kCXLLogicalDeviceCollection,
  kCable,
  kCableCollection,
  kCertificate,
  kCertificateCollection,
  kCertificateLocations,
  kCertificateService,
  kChassis,
  kChassisCollection,
  kCircuit,
  kCircuitCollection,
  kComponentIntegrity,
  kComponentIntegrityCollection,
  kCompositionReservation,
  kCompositionReservationCollection,
  kCompositionService,
  kComputerSystem,
  kComputerSystemCollection,
  kConnection,
  kConnectionCollection,
  kConnectionMethod,
  kConnectionMethodCollection,
  kControl,
  kControlCollection,
  kDrive,
  kDriveCollection,
  kEndpoint,
  kEndpointCollection,
  kEndpointGroup,
  kEndpointGroupCollection,
  kEnvironmentMetrics,
  kEthernetInterface,
  kEthernetInterfaceCollection,
  kEventDestination,
  kEventDestinationCollection,
  kEventService,
  kExternalAccountProvider,
  kExternalAccountProviderCollection,
  kFabric,
  kFabricAdapter,
  kFabricAdapterCollection,
  kFabricCollection,
  kFacility,
  kFacilityCollection,
  kFan,
  kFanCollection,
  kGoogleAsicAgingData,
  kGoogleAsicAgingDataT0,
  kGoogleAsicCalibrationData,
  kGoogleAsicErrorCounters,
  kGoogleAsicFleetCounters,
  kGoogleAsicHbmErrors,
  kGoogleAsicHbmPcr,
  kGoogleAsicHbmPpr,
  kGoogleAsicUtilization,
  kGoogleBareMetalInstance,
  kGoogleBmcNfMetrics,
  kGoogleBmcSocketMetrics,
  kGoogleBootNumber,
  kGoogleBootTime,
  kGoogleErrorCounter,
  kGoogleErrorCounterCollection,
  kGoogleHbmOnlineRepair,
  kGoogleHft,
  kGoogleManagedObjectStoreMetrics,
  kGoogleNvmeMetric,
  kGooglePower,
  kGooglePowerCap,
  kGooglePowerTpu,
  kGooglePowerTpuCollection,
  kGooglePowerVCore,
  kGooglePowerVCoreCollection,
  kGoogleProcessor,
  kGoogleRasService,
  kGooglegRPCStatistics,
  kGraphicsController,
  kGraphicsControllerCollection,
  kHeater,
  kHeaterCollection,
  kHeaterMetrics,
  kHostInterface,
  kHostInterfaceCollection,
  kJob,
  kJobCollection,
  kJobService,
  kJsonSchemaFile,
  kJsonSchemaFileCollection,
  kKey,
  kKeyCollection,
  kKeyPolicy,
  kKeyPolicyCollection,
  kKeyService,
  kLogEntry,
  kLogEntryCollection,
  kLogService,
  kLogServiceCollection,
  kManager,
  kManagerAccount,
  kManagerAccountCollection,
  kManagerCollection,
  kManagerDiagnosticData,
  kManagerNetworkProtocol,
  kMediaController,
  kMediaControllerCollection,
  kMemory,
  kMemoryChunks,
  kMemoryChunksCollection,
  kMemoryCollection,
  kMemoryDomain,
  kMemoryDomainCollection,
  kMemoryMetrics,
  kMessageRegistryFile,
  kMessageRegistryFileCollection,
  kMetricDefinition,
  kMetricDefinitionCollection,
  kMetricReport,
  kMetricReportCollection,
  kMetricReportDefinition,
  kMetricReportDefinitionCollection,
  kNVMe,
  kNVMeCollection,
  kNVMeController,
  kNVMeControllerCollection,
  kNetworkAdapter,
  kNetworkAdapterCollection,
  kNetworkAdapterMetrics,
  kNetworkDeviceFunction,
  kNetworkDeviceFunctionCollection,
  kNetworkDeviceFunctionMetrics,
  kNetworkInterface,
  kNetworkInterfaceCollection,
  kNetworkPort,
  kNetworkPortCollection,
  kNvidiaDebugToken,
  kNvidiaDebugTokenService,
  kNvidiaErrorInjection,
  kNvidiaHistogram,
  kNvidiaHistogramBucket,
  kNvidiaHistogramBuckets,
  kNvidiaHistogramCollection,
  kNvidiaPowerSmoothing,
  kNvidiaPowerSmoothingPresetProfile,
  kNvidiaPowerSmoothingPresetProfileCollection,
  kNvidiaRoTImageSlot,
  kNvidiaRoTImageSlotCollection,
  kNvidiaRoTProtectedComponent,
  kNvidiaRoTProtectedComponentCollection,
  kNvidiaRoTProtectedComponentSettings,
  kNvidiaSwitchPowerMode,
  kNvidiaWorkloadPower,
  kNvidiaWorkloadPowerProfile,
  kNvidiaWorkloadPowerProfileCollection,
  kOperatingConfig,
  kOperatingConfigCollection,
  kOutlet,
  kOutletCollection,
  kOutletGroup,
  kOutletGroupCollection,
  kPCIeDevice,
  kPCIeDeviceCollection,
  kPCIeFunction,
  kPCIeFunctionCollection,
  kPCIeSlots,
  kPort,
  kPortCollection,
  kPortMetrics,
  kPortSettings,
  kPower,
  kPowerDistribution,
  kPowerDistributionCollection,
  kPowerDistributionMetrics,
  kPowerDomain,
  kPowerDomainCollection,
  kPowerEquipment,
  kPowerSubsystem,
  kPowerSupply,
  kPowerSupplyCollection,
  kPowerSupplyMetrics,
  kPrivilegeRegistry,
  kProcessor,
  kProcessorCollection,
  kProcessorMetrics,
  kProcessorResetMetrics,
  kResourceBlock,
  kResourceBlockCollection,
  kRole,
  kRoleCollection,
  kRootOfTrust,
  kRootOfTrustCollection,
  kRouteEntry,
  kRouteEntryCollection,
  kRouteSetEntry,
  kRouteSetEntryCollection,
  kSecureBoot,
  kSecureBootDatabase,
  kSecureBootDatabaseCollection,
  kSensor,
  kSensorCollection,
  kSerialInterface,
  kSerialInterfaceCollection,
  kServiceRoot,
  kSession,
  kSessionCollection,
  kSessionService,
  kSignature,
  kSignatureCollection,
  kSimpleStorage,
  kSimpleStorageCollection,
  kSoftwareInventory,
  kSoftwareInventoryCollection,
  kStorage,
  kStorageCollection,
  kStorageController,
  kStorageControllerCollection,
  kSwitch,
  kSwitchCollection,
  kSwitchMetrics,
  kTask,
  kTaskCollection,
  kTaskService,
  kTelemetryService,
  kThermal,
  kThermalMetrics,
  kThermalSubsystem,
  kTlBMCAllChassis,
  kTlBMCAllSensors,
  kTlBMCDebugApp,
  kTlBMCDebugEndpoint,
  kTlBMCDebugHftService,
  kTlBMCDebugStore,
  kTlBMCMetrics,
  kTlBMCSchedulerStats,
  kTlBMCServiceRoot,
  kTpuManagerDevice,
  kTpuManagerDeviceCollection,
  kTpuManagerDeviceMetrics,
  kTpuManagerServiceRoot,
  kTriggers,
  kTriggersCollection,
  kTrustedComponent,
  kTrustedComponentCollection,
  kUSBController,
  kUSBControllerCollection,
  kUpdateService,
  kVCATEntry,
  kVCATEntryCollection,
  kVLanNetworkInterface,
  kVLanNetworkInterfaceCollection,
  kVirtualMedia,
  kVirtualMediaCollection,
  kVolume,
  kVolumeCollection,
  kZone,
  kZoneCollection,
  // go/keep-sorted end
  kUndefined,
};

enum class Operation : uint8_t {
  kDelete = 0,
  kGet,
  kHead,
  kPatch,
  kPost,
  kPut,
  kUndefined,
};

// copybara:strip_begin(g3-shared-libs)
// Returns the string representation of the given resource entity.
std::string ResourceEntityToString(ResourceEntity entity);

// Returns the string representation of the given operation.
std::string OperationToString(Operation operation);

// Returns the resource entity of the given string.
ResourceEntity StringToResourceEntity(absl::string_view resource);

// Returns the operation of the given string.
Operation StringToOperation(absl::string_view operation);
// copybara:strip_end

}  // namespace ecclesia

#endif  // THIRD_PARTY_ECCLESIA_LIB_REDFISH_AUTHORIZER_ENUMS_H_
