// 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/sys/tools/log/log.h"

#include <lib/syslog/wire_format.h>
#include <zircon/errors.h>

#include <iostream>

namespace log {

zx_status_t ParseAndWriteLog(fuchsia::logger::LogSinkHandle log_sink, zx::time time, int argc,
                             char** argv) {
  if (argc != 3) {
    std::cerr << "Usage: log [tag] [message]" << std::endl;
    return ZX_ERR_INVALID_ARGS;
  }
  std::string tag = argv[1];
  std::string message = argv[2];

  if (tag.length() > fuchsia::logger::MAX_TAG_LEN_BYTES) {
    std::cerr << "Tag too long." << std::endl;
    return ZX_ERR_OUT_OF_RANGE;
  }

  if (tag.length() + 1 + 1 + message.length() + 1 > sizeof(fx_log_packet::data)) {
    std::cerr << "Message too long." << std::endl;
    return ZX_ERR_OUT_OF_RANGE;
  }

  zx::socket client;
  zx::socket server;
  zx_status_t status = zx::socket::create(ZX_SOCKET_DATAGRAM, &client, &server);
  if (status != ZX_OK) {
    std::cerr << "Failed to create socket." << std::endl;
    return status;
  }

  status = log_sink.BindSync()->Connect(std::move(server));
  if (status != ZX_OK) {
    std::cerr << "Failed to connect socket." << std::endl;
    return status;
  }

  fx_log_packet packet{
      .metadata{
          .time = time.get(),
          .severity = static_cast<fx_log_severity_t>(fuchsia::logger::LOG_LEVEL_DEFAULT),
      },
  };
  packet.data[0] = static_cast<char>(tag.length());
  tag.copy(&packet.data[1], tag.length());
  message.copy(&packet.data[tag.length() + 2], message.length());
  size_t actual = 0;
  status = client.write(0, &packet, sizeof(packet), &actual);
  if (status != ZX_OK || actual != sizeof(packet)) {
    std::cerr << "Failed to write data to socket." << std::endl;
    return status == ZX_OK ? ZX_ERR_INTERNAL : status;
  }

  return ZX_OK;
}

}  // namespace log
