/* Copyright 2021 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.
 */

#include "hardware_verifier/hw_verification_report_getter_impl.h"

#include <memory>
#include <utility>

#include <base/files/file_path.h>
#include <base/logging.h>
#include <base/optional.h>

#include "hardware_verifier/hardware_verifier.pb.h"
#include "hardware_verifier/hw_verification_spec_getter_impl.h"
#include "hardware_verifier/observer.h"
#include "hardware_verifier/probe_result_getter_impl.h"
#include "hardware_verifier/verifier_impl.h"

namespace hardware_verifier {

HwVerificationReportGetterImpl::HwVerificationReportGetterImpl()
    : pr_getter_(std::make_unique<ProbeResultGetterImpl>()),
      vs_getter_(std::make_unique<HwVerificationSpecGetterImpl>()),
      verifier_(std::make_unique<VerifierImpl>()) {}

base::Optional<HwVerificationReport> HwVerificationReportGetterImpl::Get(
    const base::StringPiece& probe_result_file,
    const base::StringPiece& hw_verification_spec_file,
    ErrorCode* out_error_code) const {
  DVLOG(1) << "Get the verification payload.";
  base::Optional<HwVerificationSpec> hw_verification_spec;
  if (hw_verification_spec_file.empty()) {
    hw_verification_spec = vs_getter_->GetDefault();
    if (!hw_verification_spec) {
      if (out_error_code)
        *out_error_code =
            ErrorCode::kErrorCodeMissingDefaultHwVerificationSpecFile;
      return base::nullopt;
    }
  } else {
    hw_verification_spec =
        vs_getter_->GetFromFile(base::FilePath(hw_verification_spec_file));
    if (!hw_verification_spec) {
      if (out_error_code)
        *out_error_code = ErrorCode::kErrorCodeInvalidHwVerificationSpecFile;
      return base::nullopt;
    }
  }

  DVLOG(1) << "Get the probe result.";
  base::Optional<runtime_probe::ProbeResult> probe_result;
  if (probe_result_file.empty()) {
    auto observer = Observer::GetInstance();
    observer->StartTimer(hardware_verifier::kMetricTimeToProbe);
    probe_result = pr_getter_->GetFromRuntimeProbe();
    observer->StopTimer(hardware_verifier::kMetricTimeToProbe);

    if (!probe_result) {
      if (out_error_code)
        *out_error_code = ErrorCode::kErrorCodeProbeFail;
      return base::nullopt;
    }
  } else {
    probe_result = pr_getter_->GetFromFile(base::FilePath(probe_result_file));
    if (!probe_result) {
      if (out_error_code)
        *out_error_code = ErrorCode::kErrorCodeInvalidProbeResultFile;
      return base::nullopt;
    }
  }

  DVLOG(1) << "Verify the probe result by the verification payload.";
  const auto verifier_result =
      verifier_->Verify(probe_result.value(), hw_verification_spec.value());
  if (out_error_code) {
    if (!verifier_result)
      *out_error_code =
          ErrorCode::kErrorCodeProbeResultHwVerificationSpecMisalignment;
    else
      *out_error_code = ErrorCode::kErrorCodeNoError;
  }
  return verifier_result;
}

}  // namespace hardware_verifier
