// Copyright 2019 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/snapshot/snapshotter.h"

#include <fuchsia/feedback/cpp/fidl.h>
#include <lib/zx/time.h>
#include <zircon/errors.h>
#include <zircon/status.h>

#include <cstdio>

namespace forensics {
namespace snapshot {

bool MakeSnapshot(std::shared_ptr<sys::ServiceDirectory> services, const char* out_filename) {
  fuchsia::feedback::DataProviderSyncPtr feedback_data_provider;
  services->Connect(feedback_data_provider.NewRequest());

  fuchsia::feedback::Snapshot snapshot;
  if (const zx_status_t status = feedback_data_provider->GetSnapshot(
          std::move(fuchsia::feedback::GetSnapshotParameters().set_collection_timeout_per_data(
              zx::min(5).get())),
          &snapshot);
      status != ZX_OK) {
    fprintf(stderr, "Failed to get data from fuchsia.feedback.DataProvider: %d (%s)\n", status,
            zx_status_get_string(status));
    return false;
  }

  if (!snapshot.has_archive()) {
    fprintf(stderr, "Failed to get snapshot from fuchsia.feedback.DataProvider");
    return false;
  }

  const auto size = snapshot.archive().value.size;
  auto data = std::make_unique<uint8_t[]>(snapshot.archive().value.size);
  if (const zx_status_t status = snapshot.archive().value.vmo.read(data.get(), 0u, size);
      status != ZX_OK) {
    fprintf(stderr, "Failed to read VMO archive from fuchsia.feedback.DataProvider");
    return false;
  }

  if (out_filename) {
    FILE* out_file = fopen(out_filename, "w");
    if (!out_file) {
      fprintf(stderr, "Failed to open output file %s\n", out_filename);
      return false;
    }
    fwrite(data.get(), 1, size, out_file);
    fclose(out_file);
    return true;
  } else {
    fwrite(data.get(), 1, size, stdout);
    return true;
  }
}

}  // namespace snapshot
}  // namespace forensics
