/* Copyright 2019 The Chromium OS Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef HARDWARE_VERIFIER_CLI_H_
#define HARDWARE_VERIFIER_CLI_H_

#include <memory>
#include <ostream>
#include <string>
#include <utility>

#include <base/macros.h>

#include "hardware_verifier/hw_verification_report_getter.h"

namespace hardware_verifier {

enum CLIVerificationResult {
  kPass = 0,

  // The whole process works without errors, but the verification
  // report shows the device is not compliant.
  kFail,

  // Failed to load the probe result from the specific file.
  kInvalidProbeResultFile,

  // Failed to load the verification payload from either the default one
  // or the specific one.
  kInvalidHwVerificationSpecFile,

  // The |runtime_probe| fails to return a valid probe result.
  kProbeFail,

  // Content in the verification payload and the probe result are not matched
  // to each other.
  kProbeResultHwVerificationSpecMisalignment,

  kUnknownError
};

enum CLIOutputFormat {
  kProtoBin,  // Protobuf binary format.
  kText       // Human readable text format for debug purpose.
};

// A class that holds the core logic of the program if runs in CLI mode.
class CLI {
 public:
  // Constructor, it sets the dependent classes to the default implementation.
  CLI();
  CLI(const CLI&) = delete;
  CLI& operator=(const CLI&) = delete;

  // Verifies the probe result with the verification payload and then outputs
  // the report.
  //
  // @param probe_result_file: Path to the file that contains the probe result.
  //     If the string is empty, it invokes |runtime_probe| to get the probe
  //     result.
  // @param hw_verification_spec_file: Path to the file that contains the
  //     verification payload.  If the string is empty, it reads the default
  //     verification payload file in the rootfs.
  // @param output_format: The format of the output data.
  // @param pii: Output result including PII data like UUID and generic device
  // info.
  //
  // @return Execution result, can be either the verification result or the
  //     failure code.
  CLIVerificationResult Run(const std::string& probe_result_file,
                            const std::string& hw_verification_spec_file,
                            const CLIOutputFormat output_format,
                            bool pii);

 protected:
  // This constructor is reserved only for testing.
  CLI(std::unique_ptr<HwVerificationReportGetter> vr_getter,
      std::ostream* output_stream)
      : vr_getter_(std::move(vr_getter)), output_stream_(output_stream) {}

 private:
  // Dependent classes.
  std::unique_ptr<HwVerificationReportGetter> vr_getter_;

  // Instance to the output stream, default to |std::cout|.
  std::ostream* output_stream_;
};

}  // namespace hardware_verifier

#endif  // HARDWARE_VERIFIER_CLI_H_
