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

#include <libcrossystem/crossystem.h>

#include <base/check_op.h>
#include <libcrossystem/crossystem_impl.h>
#include <libcrossystem/crossystem_vboot_interface.h>
#include <optional>
#include <string>

namespace crossystem {

Crossystem::Crossystem() : Crossystem(std::make_unique<CrossystemImpl>()) {}

Crossystem::Crossystem(std::unique_ptr<CrossystemVbootInterface> impl)
    : impl_(std::move(impl)) {}

Crossystem::~Crossystem() = default;

std::optional<int> Crossystem::VbGetSystemPropertyInt(
    const std::string& name) const {
  return impl_->VbGetSystemPropertyInt(name);
}

bool Crossystem::VbSetSystemPropertyInt(const std::string& name, int value) {
  return impl_->VbSetSystemPropertyInt(name, value);
}

std::optional<std::string> Crossystem::VbGetSystemPropertyString(
    const std::string& name) const {
  return impl_->VbGetSystemPropertyString(name);
}

bool Crossystem::VbSetSystemPropertyString(const std::string& name,
                                           const std::string& value) {
  return impl_->VbSetSystemPropertyString(name, value);
}

std::optional<bool> Crossystem::GetSystemPropertyBool(
    const std::string& name) const {
  std::optional<int> value = VbGetSystemPropertyInt(name);
  if (!value.has_value()) {
    return std::nullopt;
  }
  CHECK_GE(*value, 0);
  return *value != 0;
}

bool Crossystem::SetSystemPropertyBool(const std::string& name, bool value) {
  return VbSetSystemPropertyInt(name, value);
}

bool Crossystem::HardwareWriteProtectIsEnabled() const {
  std::optional<bool> ret = GetSystemPropertyBool(kHardwareWriteProtect);
  CHECK(ret.has_value());
  return *ret;
}

std::string Crossystem::GetHardwareID() const {
  std::optional<std::string> ret = VbGetSystemPropertyString(kHardwareId);
  CHECK(ret.has_value());
  return *ret;
}

bool Crossystem::OnlyBootSignedKernel() const {
  std::optional<bool> ret = GetSystemPropertyBool(kDevBootSignedOnly);
  CHECK(ret.has_value());
  return *ret;
}

std::optional<std::string> Crossystem::GetMiniOsPriority() const {
  return VbGetSystemPropertyString(kMiniosPriorityProperty);
}

}  // namespace crossystem
