// Copyright 2023 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef LIBSEGMENTATION_FEATURE_MANAGEMENT_FAKE_H_
#define LIBSEGMENTATION_FEATURE_MANAGEMENT_FAKE_H_

#include <map>
#include <set>
#include <string>

#include <brillo/brillo_export.h>

#include "libsegmentation/feature_management.h"
#include "libsegmentation/feature_management_interface.h"

namespace segmentation {

namespace fake {

// A fake implementation that simulates the manipulation of features properties
// with an in-memory table.  By default, all features are unset so getters
// will return |false| or 0.
class BRILLO_EXPORT FeatureManagementFake : public FeatureManagementInterface {
 public:
  FeatureManagementFake() = default;

  bool IsFeatureEnabled(const std::string& name) override;

  FeatureLevel GetFeatureLevel() override;
  FeatureLevel GetMaxFeatureLevel() override;
  ScopeLevel GetScopeLevel() override;

  const std::set<std::string> ListFeatures(const FeatureUsage usage) override;

  bool FlashLevels() override;

  // Set the feature level for the device.
  //
  // @param level: the feature level.
  void SetFeatureLevel(FeatureLevel level);

  // Set the max feature level for any device.
  //
  // @param level: the feature level.
  void SetMaxFeatureLevel(FeatureLevel level);

  // Set the scope level for the device.
  //
  // @param level: the scope level.
  void SetScopeLevel(ScopeLevel level);

  // Set the value of the specific feature.
  //
  // After the feature is set, IsFeatureEnabled() returns |true|.
  //
  // @param name The name of feature.
  void SetFeature(const std::string& name, const FeatureUsage usage);

  // Unset the value of the specific feature.
  //
  // After the feature is unset, IsFeatureEnabled() returns |false|.
  //
  // @param name The name of feature.
  void UnsetFeature(const std::string& name);

 private:
  FeatureLevel system_features_level_;
  FeatureLevel max_features_level_;
  ScopeLevel system_scope_level_;
  std::map<const FeatureUsage, std::set<std::string>>
      system_features_properties_;
};

}  // namespace fake

}  // namespace segmentation

#endif  // LIBSEGMENTATION_FEATURE_MANAGEMENT_FAKE_H_
