// Copyright 2020 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 "shill/dbus/mm1_proxy.h"

#include <tuple>

#include "shill/cellular/cellular_error.h"
#include "shill/logging.h"

using std::string;

namespace shill {

namespace Logging {
static auto kModuleLogScope = ScopeLogger::kDBus;
static string ObjectID(const dbus::ObjectPath* p) {
  return p->value();
}
}  // namespace Logging

namespace mm1 {

Mm1Proxy::Mm1Proxy(const scoped_refptr<dbus::Bus>& bus, const string& service)
    : proxy_(new org::freedesktop::ModemManager1Proxy(bus, service)) {}

Mm1Proxy::~Mm1Proxy() = default;

void Mm1Proxy::ScanDevices(const ResultCallback& callback) {
  SLOG(&proxy_->GetObjectPath(), 2) << __func__;
  proxy_->ScanDevicesAsync(
      base::Bind(&Mm1Proxy::OnOperationSuccess, weak_factory_.GetWeakPtr(),
                 callback, __func__),
      base::Bind(&Mm1Proxy::OnOperationFailure, weak_factory_.GetWeakPtr(),
                 callback, __func__),
      dbus::ObjectProxy::TIMEOUT_USE_DEFAULT);
}

void Mm1Proxy::SetLogging(const std::string& level,
                          const ResultCallback& callback) {
  SLOG(&proxy_->GetObjectPath(), 2) << __func__ << ": " << level;
  proxy_->SetLoggingAsync(
      level,
      base::Bind(&Mm1Proxy::OnOperationSuccess, weak_factory_.GetWeakPtr(),
                 callback, __func__),
      base::Bind(&Mm1Proxy::OnOperationFailure, weak_factory_.GetWeakPtr(),
                 callback, __func__),
      dbus::ObjectProxy::TIMEOUT_USE_DEFAULT);
}

void Mm1Proxy::InhibitDevice(const std::string& uid,
                             bool inhibit,
                             const ResultCallback& callback) {
  SLOG(&proxy_->GetObjectPath(), 2)
      << __func__ << ": " << uid << " = " << inhibit;
  proxy_->InhibitDeviceAsync(
      uid, inhibit,
      base::Bind(&Mm1Proxy::OnOperationSuccess, weak_factory_.GetWeakPtr(),
                 callback, __func__),
      base::Bind(&Mm1Proxy::OnOperationFailure, weak_factory_.GetWeakPtr(),
                 callback, __func__),
      dbus::ObjectProxy::TIMEOUT_USE_DEFAULT);
}

void Mm1Proxy::OnOperationSuccess(const ResultCallback& callback,
                                  const string& operation) {
  SLOG(&proxy_->GetObjectPath(), 2) << __func__ << ": " << operation;
  callback.Run(Error());
}

void Mm1Proxy::OnOperationFailure(const ResultCallback& callback,
                                  const string& operation,
                                  brillo::Error* dbus_error) {
  SLOG(&proxy_->GetObjectPath(), 2) << __func__ << ": " << operation;
  Error error;
  CellularError::FromMM1ChromeosDBusError(dbus_error, &error);
  callback.Run(error);
}

}  // namespace mm1
}  // namespace shill
