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

#include <memory>

#include <base/bind.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"
#include "mist/usb_modem_switch_context.h"
#include "mist/usb_modem_switch_operation.h"

using base::Bind;
using base::Unretained;
using std::string;
using std::unique_ptr;

namespace mist {

// TODO(benchan): Add unit tests for UsbModemSwitcher.

UsbModemSwitcher::UsbModemSwitcher(Context* context) : context_(context) {
  CHECK(context_);
}

UsbModemSwitcher::~UsbModemSwitcher() {
  context_->usb_device_event_notifier()->RemoveObserver(this);
}

void UsbModemSwitcher::Start() {
  context_->usb_device_event_notifier()->AddObserver(this);
  context_->usb_device_event_notifier()->ScanExistingDevices();
}

void UsbModemSwitcher::OnSwitchOperationCompleted(
    UsbModemSwitchOperation* operation,
    bool success) {
  CHECK(operation);
  delete operation;
}

void UsbModemSwitcher::OnUsbDeviceAdded(const string& sys_path,
                                        uint8_t bus_number,
                                        uint8_t device_address,
                                        uint16_t vendor_id,
                                        uint16_t product_id) {
  const UsbModemInfo* modem_info =
      context_->config_loader()->GetUsbModemInfo(vendor_id, product_id);
  if (!modem_info)
    return;  // Ignore an unsupported device.

  unique_ptr<UsbModemSwitchContext> switch_context(new UsbModemSwitchContext(
      sys_path, bus_number, device_address, vendor_id, product_id, modem_info));
  CHECK(switch_context);

  UsbModemSwitchOperation* operation =
      new UsbModemSwitchOperation(context_, switch_context.release());
  CHECK(operation);

  // The operation object will be deleted in OnSwitchOperationCompleted().
  operation->Start(
      Bind(&UsbModemSwitcher::OnSwitchOperationCompleted, Unretained(this)));
}

void UsbModemSwitcher::OnUsbDeviceRemoved(const string& sys_path) {
  // UsbModemSwitcher does not need to handle device removal.
}

}  // namespace mist
