// Copyright (c) 2012 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 "wimax_manager/device.h"

#include <base/logging.h>

#include "wimax_manager/device_dbus_adaptor.h"

using std::string;

namespace wimax_manager {

namespace {

const size_t kMACAddressLength = 6;
const size_t kBaseStationIdLength = 6;

// Default time interval, in seconds, between network scans.
const int kDefaultNetworkScanIntervalInSeconds = 10;

// Default time interval, in seconds, between status updates.
const int kDefaultStatusUpdateIntervalInSeconds = 10;

string GetDeviceStatusDescription(DeviceStatus device_status) {
  switch (device_status) {
    case kDeviceStatusUninitialized:
      return "Uninitialized";
    case kDeviceStatusDisabled:
      return "Disabled";
    case kDeviceStatusReady:
      return "Ready";
    case kDeviceStatusScanning:
      return "Scanning";
    case kDeviceStatusConnecting:
      return "Connecting";
    case kDeviceStatusConnected:
      return "Connected";
  }
  return "Unknown";
}

}  // namespace

Device::Device(Manager *manager, uint8 index, const string &name)
    : manager_(manager),
      index_(index),
      name_(name),
      mac_address_(kMACAddressLength),
      base_station_id_(kBaseStationIdLength),
      frequency_(0),
      network_scan_interval_(kDefaultNetworkScanIntervalInSeconds),
      status_update_interval_(kDefaultStatusUpdateIntervalInSeconds),
      status_(kDeviceStatusUninitialized) {
}

Device::~Device() {
}

void Device::UpdateNetworks() {
  dbus_adaptor()->UpdateNetworks();
}

void Device::UpdateRFInfo() {
  dbus_adaptor()->UpdateRFInfo();
}

void Device::SetNetworkScanInterval(uint32 network_scan_interval) {
  if (network_scan_interval_ != network_scan_interval) {
    network_scan_interval_ = network_scan_interval;
    UpdateNetworkScanInterval(network_scan_interval);
  }
}

void Device::SetStatusUpdateInterval(uint32 status_update_interval) {
  if (status_update_interval_ != status_update_interval) {
    status_update_interval_ = status_update_interval;
    UpdateStatusUpdateInterval(status_update_interval);
  }
}

void Device::SetMACAddress(const ByteIdentifier &mac_address) {
  mac_address_.CopyFrom(mac_address);
  if (dbus_adaptor())
    dbus_adaptor()->UpdateMACAddress();
}

void Device::SetBaseStationId(const ByteIdentifier &base_station_id) {
  base_station_id_.CopyFrom(base_station_id);
}

void Device::SetStatus(DeviceStatus status) {
  if (status_ != status) {
    LOG(INFO) << "Device status changed from "
              << GetDeviceStatusDescription(status_) << " to "
              << GetDeviceStatusDescription(status);
    status_ = status;
    dbus_adaptor()->UpdateStatus();
  }
}

}  // namespace wimax_manager
