// Copyright 2014 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 "feedback/feedback_service_interface.h"

#include <memory>

#include "base/bind.h"
#include "base/message_loop/message_loop.h"
#include "chromeos/dbus/service_constants.h"
#include "components/feedback/feedback_common.h"
#include "components/feedback/proto/extension.pb.h"
#include "dbus/object_proxy.h"

DBusFeedbackServiceInterface::DBusFeedbackServiceInterface() {
  dbus::Bus::Options options;
  options.bus_type = dbus::Bus::SYSTEM;
  bus_ = new dbus::Bus(options);
}

bool DBusFeedbackServiceInterface::SendFeedback(
    const FeedbackCommon& feedback,
    FeedbackResultCallback callback) {
  // A product ID of 0 generally means that the caller just forgot to
  // set it at all, and an empty description is apparently ignored
  // by the feedback servers.
  if (feedback.description().empty() || feedback.product_id() == 0) {
    return false;
  }

  userfeedback::ExtensionSubmit submit;
  feedback.PrepareReport(&submit);

  dbus::MethodCall call(feedback::kFeedbackServiceName,
                        feedback::kSendFeedback);

  dbus::MessageWriter writer(&call);
  writer.AppendProtoAsArrayOfBytes(submit);

  dbus::ObjectProxy* object = bus_->GetObjectProxy(
      feedback::kFeedbackServiceName,
      dbus::ObjectPath(feedback::kFeedbackServicePath));

  std::unique_ptr<dbus::Response> response =
      object->CallMethodAndBlock(&call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT);
  if (response.get() == nullptr) {
    callback.Run(false);
    return true;
  }

  bool status = false;
  const auto &message_type = response->GetMessageType();
  if (message_type == dbus::ErrorResponse::MESSAGE_METHOD_RETURN) {
    dbus::MessageReader reader(response.get());
    reader.PopBool(&status);
  }

  callback.Run(status);
  return true;
}
