// 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/check.h>
#include <base/strings/stringprintf.h>
#include <brillo/udev/udev.h>
#include <brillo/udev/udev_device.h>

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

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 std::string& sys_path) {
  CHECK(context);

  std::unique_ptr<brillo::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) << base::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
