// 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.
//
// simple executable to encapsulation libsegmentation library to check from the
// command line if a feature is enabled. The commands are purposely limited as
// this executable is installed on all images.

#include <iostream>

#include <base/logging.h>
#include <brillo/flag_helper.h>
#include <libsegmentation/feature_management.h>

int main(int argc, char* argv[]) {
  DEFINE_string(feature_name, "", "return true when the feature is supported");
  DEFINE_bool(feature_level, false, "return the feature level for the device");
  DEFINE_bool(scope_level, false, "return the scope level for the device");
  DEFINE_bool(flash, false, "update feature information in VPD");
  brillo::FlagHelper::Init(argc, argv, "Query the segmentation library");

  const base::CommandLine* cl = base::CommandLine::ForCurrentProcess();
  if (cl->GetArgs().size() > 0) {
    LOG(ERROR) << "Unknown extra command line arguments; exiting";
    return EXIT_FAILURE;
  }

  segmentation::FeatureManagement feature_management;
  if (FLAGS_feature_level) {
    std::cout << feature_management.GetFeatureLevel() << std::endl;
  } else if (FLAGS_scope_level) {
    std::cout << feature_management.GetScopeLevel() << std::endl;
  } else if (FLAGS_flash) {
    std::cout << feature_management.FlashLevels() << std::endl;
  } else if (!FLAGS_feature_name.empty()) {
    std::cout << feature_management.IsFeatureEnabled(FLAGS_feature_name)
              << std::endl;
  } else {
    LOG(ERROR) << "Please specify an option to control execution mode.";
    return EXIT_FAILURE;
  }

  return 0;
}
