// 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 "mist/usb_modem_switch_context.h"

#include <memory>

#include <base/strings/stringprintf.h>

#include "mist/config_loader.h"
#include "mist/context.h"
#include "mist/proto_bindings/usb_modem_info.pb.h"
#include "mist/udev.h"
#include "mist/udev_device.h"
#include "mist/usb_device_event_notifier.h"

using base::StringPrintf;
using std::string;
using std::unique_ptr;

namespace mist {

UsbModemSwitchContext::UsbModemSwitchContext()
    : bus_number_(0),
      device_address_(0),
      vendor_id_(0),
      product_id_(0),
      modem_info_(nullptr) {}

UsbModemSwitchContext::UsbModemSwitchContext(const std::string& sys_path,
                                             uint8_t bus_number,
                                             uint8_t device_address,
                                             uint16_t vendor_id,
                                             uint16_t product_id,
                                             const UsbModemInfo* modem_info)
    : sys_path_(sys_path),
      bus_number_(bus_number),
      device_address_(device_address),
      vendor_id_(vendor_id),
      product_id_(product_id),
      modem_info_(modem_info) {}

bool UsbModemSwitchContext::InitializeFromSysPath(const Context* context,
                                                  const string& sys_path) {
  CHECK(context);

  unique_ptr<UdevDevice> device(
      context->udev()->CreateDeviceFromSysPath(sys_path.c_str()));
  if (!device) {
    VLOG(1) << "Could not find device '" << sys_path << "'.";
    return false;
  }

  uint8_t bus_number;
  uint8_t device_address;
  uint16_t vendor_id;
  uint16_t product_id;
  if (!context->usb_device_event_notifier()->GetDeviceAttributes(
          device.get(),
          &bus_number,
          &device_address,
          &vendor_id,
          &product_id)) {
    VLOG(1) << "Could not get attributes of device '" << sys_path << "'.";
    return false;
  }

  const UsbModemInfo* modem_info =
      context->config_loader()->GetUsbModemInfo(vendor_id, product_id);
  if (!modem_info) {
    VLOG(1) << "Could not find USB modem info for device '" << sys_path << "'.";
    return false;
  }

  sys_path_ = sys_path;
  bus_number_ = bus_number;
  device_address_ = device_address;
  vendor_id_ = vendor_id;
  product_id_ = product_id;
  modem_info_ = modem_info;

  VLOG(1) << StringPrintf("Initialized UsbModemSwitchContext("
                          "SysPath=%s, "
                          "BusNumber=%03u, "
                          "DeviceAddress=%03u, "
                          "VendorId=0x%04x, "
                          "ProductId=0x%04x)",
                          sys_path_.c_str(),
                          bus_number_,
                          device_address_,
                          vendor_id_,
                          product_id_);
  return true;
}

}  // namespace mist
