// Copyright (c) 2013 The Chromium OS 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 "p2p/common/server_message.h"

#include <glib.h>
#include <inttypes.h>

#include <base/format_macros.h>
#include <base/logging.h>
#include <base/strings/string_number_conversions.h>
#include <base/strings/stringprintf.h>

using std::string;

namespace p2p {

namespace util {

bool ValidP2PServerMessageMagic(const P2PServerMessage& message) {
  return message.magic == kP2PServerMagic;
}

bool ParseP2PServerMessageType(uint32_t value, P2PServerMessageType* result) {
  CHECK(result);
  if (value >= kNumP2PServerMessageTypes)
    return false;
  *result = static_cast<P2PServerMessageType>(value);
  return true;
}

bool ParseP2PServerRequestResult(int64_t value,
                                 P2PServerRequestResult* result) {
  CHECK(result);
  if (value < 0 || value >= kNumP2PServerRequestResults)
    return false;
  *result = static_cast<P2PServerRequestResult>(value);
  return true;
}

string ToString(const P2PServerMessage& message) {
  if (message.magic != kP2PServerMagic) {
    return base::StringPrintf(
        "{InvalidMagic[%" PRIx64 "], Unknown[%" PRIu32 "]: %" PRId64 "}",
        message.magic, message.message_type, message.value);
  }

  P2PServerMessageType message_type;
  if (!ParseP2PServerMessageType(message.message_type, &message_type)) {
    return base::StringPrintf("{InvalidType[%" PRIu32 "]: %" PRId64 "}",
        message.message_type, message.value);
  }

  string res = "{" + ToString(message_type) + ": ";
  if (message_type == kP2PServerRequestResult) {
    P2PServerRequestResult req_res;
    if (!ParseP2PServerRequestResult(message.value, &req_res)) {
      return res + "InvalidRequestResult[" +
          base::Int64ToString(message.value) + "]}";
    }
    return res + ToString(req_res) + "}";
  }
  return res + base::Int64ToString(message.value) + "}";
}

std::string ToString(P2PServerMessageType message_type) {
  switch (message_type) {
    case kP2PServerNumConnections:        return "NumConnections";
    case kP2PServerRequestResult:         return "RequestResult";
    case kP2PServerServedSuccessfullyMB:  return "ServedSuccessfullyMB";
    case kP2PServerServedInterruptedMB:   return "ServedInterruptedMB";
    case kP2PServerRangeBeginPercentage:  return "RangeBeginPercentage";
    case kP2PServerDownloadSpeedKBps:     return "DownloadSpeedKBps";
    case kP2PServerPeakDownloadSpeedKBps: return "PeakDownloadSpeedKBps";
    case kP2PServerClientCount:           return "ClientCount";
    case kP2PServerPortNumber:            return "PortNumber";

    case kNumP2PServerMessageTypes:       return "Unknown";
    // Don't add a default case to let the compiler warn about newly added
    // message types which should be added here.
  }
  return "Unknown";
}

std::string ToString(P2PServerRequestResult request_result) {
  switch (request_result) {
    case kP2PRequestResultResponseSent:        return "ResponseSent";
    case kP2PRequestResultResponseInterrupted: return "ResponseInterrupted";
    case kP2PRequestResultMalformed:           return "Malformed";
    case kP2PRequestResultNotFound:            return "NotFound";
    case kP2PRequestResultIndex:               return "Index";

    case kNumP2PServerRequestResults:          return "Unknown";
    // Don't add a default case to let the compiler warn about newly added
    // message types which should be added here.
  }
  return "Unknown";
}

}  // namespace util

}  // namespace p2p
