// 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_IMPL_H_
#define LIBSEGMENTATION_FEATURE_MANAGEMENT_IMPL_H_

#include <memory>
#include <set>
#include <string>

#include <base/files/file.h>
#include <base/files/file_path.h>
#include <brillo/brillo_export.h>
#include <libcrossystem/crossystem.h>
#include <vpd/vpd.h>

#include "libsegmentation/device_info.pb.h"
#include "libsegmentation/feature_management_interface.h"
#include "proto/device_selection.pb.h"
#include "proto/feature_management.pb.h"

using chromiumos::feature_management::api::software::DeviceSelection;
using chromiumos::feature_management::api::software::FeatureBundle;
using chromiumos::feature_management::api::software::SelectionBundle;

namespace segmentation {

// Temporary file containing the device information and read first,
// for development purposes.
constexpr const char kTempDeviceInfoPath[] =
    "/run/libsegmentation/feature_device_info";

// VPD key name for persisting CBX status.
constexpr char kVpdKeyDeviceInfo[] = "feature_device_info";

// An implementation that invokes the corresponding functions provided
// in feature_management_interface.h.
class BRILLO_EXPORT FeatureManagementImpl : public FeatureManagementInterface {
 public:
  // Default implementation that use the database created by package
  // feature-management-data.
  FeatureManagementImpl();

  FeatureManagementImpl(crossystem::Crossystem* crossystem,
                        vpd::Vpd* vpd,
                        const std::string& feature_db,
                        const std::string& selection_db,
                        const std::string& os_version);

  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;

  // Return feature level information based on HWID information and
  // hardware requirement.
  std::optional<DeviceSelection> GetDeviceInfoFromHwid(bool check_prefix_only);

 private:
  // Internal feature database
  FeatureBundle feature_bundle_;

  // Internal selection database
  SelectionBundle selection_bundle_;

#if USE_FEATURE_MANAGEMENT
  // Reads device info from the stateful partition, if not present reads it from
  // the hardware and then writes it to the stateful partition. After this it
  // tries to cache it to |cached_device_info_|.
  //
  // If we fail to write it to the stateful partition then this function will
  // return false and not set |cached_device_info_|.
  bool CacheDeviceInfo();

  // Check hardware requirement based on feature level
  // Currently for feature level 1 device, we need:
  // - 8GB of RAM
  // - 128GB SSD
  // See go/cros-tiering-prd for reference.
  bool Check_HW_Requirement(const DeviceSelection& selection);

  // Cache valid device information read from the stateful partition.
  std::optional<libsegmentation::DeviceInfo> cached_device_info_;

  // Hashed version of the current chromeos version (CHROMEOS_RELEASE_VERSION)
  uint32_t current_version_hash_;

  // To acccess internal data. Can be overriden, using backend if not.
  crossystem::Crossystem* crossystem_;
  std::unique_ptr<crossystem::Crossystem> crossystem_backend_;

  // To access internal data. Can be overridden, using backend if not.
  vpd::Vpd* vpd_;
  std::unique_ptr<vpd::Vpd> vpd_backend_;

#endif
};

}  // namespace segmentation

#endif  // LIBSEGMENTATION_FEATURE_MANAGEMENT_IMPL_H_
