// 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.

#include <set>
#include <string>

#include <base/files/file_path.h>

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

namespace segmentation {

FeatureManagement::FeatureManagement()
    : FeatureManagement(std::make_unique<FeatureManagementImpl>()) {}

FeatureManagement::FeatureManagement(
    std::unique_ptr<FeatureManagementInterface> impl)
    : impl_(std::move(impl)) {}

bool FeatureManagement::IsFeatureEnabled(const std::string& name) {
  return impl_->IsFeatureEnabled(name);
}

int FeatureManagement::GetFeatureLevel() const {
  auto level = impl_->GetFeatureLevel();
  if (level == FeatureManagementInterface::FEATURE_LEVEL_UNKNOWN) {
    level = FeatureManagementInterface::FEATURE_LEVEL_0;
  }
  return level - FeatureManagementInterface::FEATURE_LEVEL_VALID_OFFSET;
}

int FeatureManagement::GetMaxFeatureLevel() const {
  return impl_->GetMaxFeatureLevel() -
         FeatureManagementInterface::FEATURE_LEVEL_VALID_OFFSET;
}

int FeatureManagement::GetScopeLevel() const {
  auto level = impl_->GetScopeLevel();
  if (level == FeatureManagementInterface::SCOPE_LEVEL_UNKNOWN) {
    level = FeatureManagementInterface::SCOPE_LEVEL_0;
  }
  return level -
         FeatureManagementInterface::ScopeLevel::SCOPE_LEVEL_VALID_OFFSET;
}

const std::set<std::string> FeatureManagement::ListFeatures(
    const FeatureUsage usage) {
  return impl_->ListFeatures(usage);
}

bool FeatureManagement::FlashLevels() {
  return impl_->FlashLevels();
}

}  // namespace segmentation
