// Copyright 2019 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 "login_manager/chrome_features_service_client.h"

#include <utility>

#include <base/bind.h>
#include <chromeos/dbus/service_constants.h>
#include <dbus/message.h>
#include <dbus/object_proxy.h>

namespace login_manager {

ChromeFeaturesServiceClient::ChromeFeaturesServiceClient(
    dbus::ObjectProxy* proxy)
    : proxy_(proxy) {}

ChromeFeaturesServiceClient::~ChromeFeaturesServiceClient() = default;

void ChromeFeaturesServiceClient::IsFeatureEnabled(
    const std::string& feature_name, IsFeatureEnabledCallback callback) {
  proxy_->WaitForServiceToBeAvailable(base::Bind(
      &ChromeFeaturesServiceClient::OnWaitForServiceForIsFeatureEnabled,
      weak_ptr_factory_.GetWeakPtr(), feature_name, std::move(callback)));
}

void ChromeFeaturesServiceClient::OnWaitForServiceForIsFeatureEnabled(
    const std::string& feature_name,
    IsFeatureEnabledCallback callback,
    bool available) {
  if (!available) {
    std::move(callback).Run(base::nullopt);
    return;
  }

  CallIsFeatureEnabled(feature_name, std::move(callback));
}

void ChromeFeaturesServiceClient::CallIsFeatureEnabled(
    const std::string& feature_name, IsFeatureEnabledCallback callback) {
  dbus::MethodCall call(chromeos::kChromeFeaturesServiceInterface,
                        chromeos::kChromeFeaturesServiceIsFeatureEnabledMethod);
  dbus::MessageWriter writer(&call);
  writer.AppendString(feature_name);
  proxy_->CallMethod(
      &call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
      base::Bind(&ChromeFeaturesServiceClient::HandlelIsFeatureEnabledResponse,
                 weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
}

void ChromeFeaturesServiceClient::HandlelIsFeatureEnabledResponse(
    IsFeatureEnabledCallback callback, dbus::Response* response) {
  if (!response) {
    std::move(callback).Run(base::nullopt);
    return;
  }

  dbus::MessageReader reader(response);
  bool feature_enabled = false;
  if (!reader.PopBool(&feature_enabled)) {
    std::move(callback).Run(base::nullopt);
    return;
  }

  std::move(callback).Run(feature_enabled);
}

}  // namespace login_manager
