/* 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();
  } 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
