// 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 "garnet/bin/trace_manager/util.h"

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

namespace tracing {

TransferStatus WriteBufferToSocket(const zx::socket& socket, const void* buffer, size_t len) {
  auto data = reinterpret_cast<const uint8_t*>(buffer);
  size_t offset = 0;
  while (offset < len) {
    zx_status_t status = ZX_OK;
    size_t actual = 0;
    if ((status = socket.write(0u, data + offset, len - offset, &actual)) < 0) {
      if (status == ZX_ERR_SHOULD_WAIT) {
        zx_signals_t pending = 0;
        status = socket.wait_one(ZX_SOCKET_WRITABLE | ZX_SOCKET_PEER_CLOSED, zx::time::infinite(),
                                 &pending);
        if (status < 0) {
          FX_LOGS(ERROR) << "Wait on socket failed: " << status;
          return TransferStatus::kWriteError;
        }

        if (pending & ZX_SOCKET_WRITABLE)
          continue;

        if (pending & ZX_SOCKET_PEER_CLOSED) {
          FX_LOGS(ERROR) << "Peer closed while writing to socket";
          return TransferStatus::kReceiverDead;
        }
      }

      return TransferStatus::kWriteError;
    }
    offset += actual;
  }

  return TransferStatus::kComplete;
}

std::ostream& operator<<(std::ostream& out, TransferStatus status) {
  switch (status) {
    case TransferStatus::kComplete:
      out << "complete";
      break;
    case TransferStatus::kProviderError:
      out << "provider error";
      break;
    case TransferStatus::kWriteError:
      out << "write error";
      break;
    case TransferStatus::kReceiverDead:
      out << "receiver dead";
      break;
  }

  return out;
}

std::ostream& operator<<(std::ostream& out, controller::BufferDisposition disposition) {
  switch (disposition) {
    case controller::BufferDisposition::CLEAR_ALL:
      out << "clear-all";
      break;
    case controller::BufferDisposition::CLEAR_NONDURABLE:
      out << "clear-nondurable";
      break;
    case controller::BufferDisposition::RETAIN:
      out << "retain";
      break;
  }

  return out;
}

std::ostream& operator<<(std::ostream& out, controller::SessionState state) {
  switch (state) {
    case controller::SessionState::READY:
      out << "ready";
      break;
    case controller::SessionState::INITIALIZED:
      out << "initialized";
      break;
    case controller::SessionState::STARTING:
      out << "starting";
      break;
    case controller::SessionState::STARTED:
      out << "started";
      break;
    case controller::SessionState::STOPPING:
      out << "stopping";
      break;
    case controller::SessionState::STOPPED:
      out << "stopped";
      break;
    case controller::SessionState::TERMINATING:
      out << "terminaing";
      break;
  }

  return out;
}

}  // namespace tracing
