// Copyright 2020 The Fuchsia 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 "src/developer/forensics/crash_reports/report.h"

#include <lib/syslog/cpp/macros.h>
#include <zircon/errors.h>

namespace forensics {
namespace crash_reports {
namespace {

std::optional<SizedData> MakeAttachment(const fuchsia::mem::Buffer& buffer) {
  if (!buffer.vmo.is_valid()) {
    return std::nullopt;
  }

  SizedData data(buffer.size, 0u);
  if (const zx_status_t status = buffer.vmo.read(data.data(), /*offset=*/0u, /*len=*/data.size());
      status != ZX_OK) {
    FX_PLOGS(ERROR, status) << "Failed to read vmo";
    return std::nullopt;
  }
  return data;
}

}  // namespace

std::optional<Report> Report::MakeReport(const ReportId report_id,
                                         const std::string& program_shortname,
                                         const AnnotationMap& annotations,
                                         std::map<std::string, fuchsia::mem::Buffer> attachments,
                                         forensics::crash_reports::SnapshotUuid snapshot_uuid,
                                         std::optional<fuchsia::mem::Buffer> minidump,
                                         const bool is_hourly_report) {
  std::map<std::string, SizedData> attachment_copies;
  for (const auto& [k, v] : attachments) {
    if (k.empty()) {
      return std::nullopt;
    }

    auto attachment = MakeAttachment(v);
    if (!attachment) {
      return std::nullopt;
    }
    attachment_copies.emplace(k, std::move(attachment.value()));
  }

  std::optional<SizedData> minidump_copy =
      minidump.has_value() ? MakeAttachment(minidump.value()) : std::nullopt;

  return Report(report_id, program_shortname, annotations, std::move(attachment_copies),
                std::move(snapshot_uuid), std::move(minidump_copy), is_hourly_report);
}

Report::Report(const ReportId report_id, const std::string& program_shortname,
               const AnnotationMap& annotations, std::map<std::string, SizedData> attachments,
               forensics::crash_reports::SnapshotUuid snapshot_uuid,
               std::optional<SizedData> minidump, const bool is_hourly_report)
    : id_(report_id),
      program_shortname_(program_shortname),
      annotations_(annotations),
      attachments_(std::move(attachments)),
      snapshot_uuid_(std::move(snapshot_uuid)),
      minidump_(std::move(minidump)),
      is_hourly_report_(is_hourly_report) {}

}  // namespace crash_reports
}  // namespace forensics
