// Copyright 2018 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 "garnet/bin/guest/cli/balloon.h"

#include <iostream>

#include <fuchsia/guest/cpp/fidl.h>
#include <lib/fxl/logging.h>
#include <virtio/balloon.h>

void handle_balloon(uint32_t env_id, uint32_t cid, uint32_t num_pages,
                    component::StartupContext* context) {
  // Connect to environment.
  fuchsia::guest::EnvironmentManagerSyncPtr environment_manager;
  context->ConnectToEnvironmentService(environment_manager.NewRequest());
  fuchsia::guest::EnvironmentControllerSyncPtr env_ptr;
  environment_manager->Connect(env_id, env_ptr.NewRequest());

  fuchsia::guest::BalloonControllerSyncPtr balloon_controller;
  env_ptr->ConnectToBalloon(cid, balloon_controller.NewRequest());

  balloon_controller->RequestNumPages(num_pages);
  std::cout << "Resizing the memory balloon to " << num_pages << " pages\n";
}

static const char* tag_name(uint16_t tag) {
  switch (tag) {
    case VIRTIO_BALLOON_S_SWAP_IN:
      return "swap-in:             ";
    case VIRTIO_BALLOON_S_SWAP_OUT:
      return "swap-out:            ";
    case VIRTIO_BALLOON_S_MAJFLT:
      return "major-faults:        ";
    case VIRTIO_BALLOON_S_MINFLT:
      return "minor-faults:        ";
    case VIRTIO_BALLOON_S_MEMFREE:
      return "free-memory:         ";
    case VIRTIO_BALLOON_S_MEMTOT:
      return "total-memory:        ";
    case VIRTIO_BALLOON_S_AVAIL:
      return "available-memory:    ";
    case VIRTIO_BALLOON_S_CACHES:
      return "disk-caches:         ";
    case VIRTIO_BALLOON_S_HTLB_PGALLOC:
      return "hugetlb-allocations: ";
    case VIRTIO_BALLOON_S_HTLB_PGFAIL:
      return "hugetlb-failures:    ";
    default:
      return "unknown:             ";
  }
}

void handle_balloon_stats(uint32_t env_id, uint32_t cid,
                          component::StartupContext* context) {
  // Connect to environment.
  fuchsia::guest::EnvironmentManagerSyncPtr environment_manager;
  context->ConnectToEnvironmentService(environment_manager.NewRequest());
  fuchsia::guest::EnvironmentControllerSyncPtr env_ptr;
  environment_manager->Connect(env_id, env_ptr.NewRequest());

  fuchsia::guest::BalloonControllerSyncPtr balloon_controller;
  env_ptr->ConnectToBalloon(cid, balloon_controller.NewRequest());

  zx_status_t status;
  fidl::VectorPtr<fuchsia::guest::MemStat> mem_stats;
  balloon_controller->GetMemStats(&status, &mem_stats);
  if (status != ZX_OK) {
    FXL_LOG(ERROR) << "Failed to get memory statistics " << status;
    return;
  }
  for (auto& mem_stat : *mem_stats) {
    std::cout << tag_name(mem_stat.tag) << mem_stat.val << '\n';
  }
}