// Copyright (c) 2013 The Chromium 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 "chromeos/dbus/audio_node.h"

#include <stdint.h>

#include "base/format_macros.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/stringprintf.h"

namespace chromeos {

AudioNode::AudioNode() = default;

AudioNode::AudioNode(bool is_input,
                     uint64_t id,
                     bool has_v2_stable_device_id,
                     uint64_t stable_device_id_v1,
                     uint64_t stable_device_id_v2,
                     std::string device_name,
                     std::string type,
                     std::string name,
                     bool active,
                     uint64_t plugged_time)
    : is_input(is_input),
      id(id),
      has_v2_stable_device_id(has_v2_stable_device_id),
      stable_device_id_v1(stable_device_id_v1),
      stable_device_id_v2(stable_device_id_v2),
      device_name(device_name),
      type(type),
      name(name),
      active(active),
      plugged_time(plugged_time) {}

AudioNode::AudioNode(const AudioNode& other) = default;

AudioNode::~AudioNode() = default;

std::string AudioNode::ToString() const {
  std::string result;
  base::StringAppendF(&result,
                      "is_input = %s ",
                      is_input ? "true" : "false");
  base::StringAppendF(&result,
                      "id = 0x%" PRIx64 " ",
                      id);
  base::StringAppendF(&result, "stable_device_id_version = %d",
                      StableDeviceIdVersion());
  base::StringAppendF(&result, "stable_device_id_v1 = 0x%" PRIx64 " ",
                      stable_device_id_v1);
  base::StringAppendF(&result, "stable_device_id_v2 = 0x%" PRIx64 " ",
                      stable_device_id_v2);
  base::StringAppendF(&result, "device_name = %s ", device_name.c_str());
  base::StringAppendF(&result,
                      "type = %s ",
                      type.c_str());
  base::StringAppendF(&result,
                      "name = %s ",
                      name.c_str());
  base::StringAppendF(&result,
                      "active = %s ",
                      active ? "true" : "false");
  base::StringAppendF(&result, "plugged_time= %s ",
                      base::NumberToString(plugged_time).c_str());

  return result;
}

int AudioNode::StableDeviceIdVersion() const {
  return has_v2_stable_device_id ? 2 : 1;
}

uint64_t AudioNode::StableDeviceId() const {
  return has_v2_stable_device_id ? stable_device_id_v2 : stable_device_id_v1;
}

}  // namespace chromeos
