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

#include "base/logging.h"
#include "bindings/extension.pb.h"
#include "chromeos/dbus/service_constants.h"
#include "components/feedback/feedback_uploader.h"
#include "dbus/bus.h"
#include "dbus/exported_object.h"
#include "dbus/message.h"
#include "dbus/object_proxy.h"

namespace feedback {
FeedbackService::FeedbackService(feedback::FeedbackUploader* uploader)
    : uploader_(uploader) {
}

FeedbackService::~FeedbackService() {}

void FeedbackService::SendFeedback(
    const userfeedback::ExtensionSubmit& report,
    const base::Callback<void(bool, const std::string&)>& callback) {
  std::string data;
  report.SerializeToString(&data);
  uploader_->QueueReport(data);

  // Currently, we don't implement status reporting; if QueueReport
  // returns then the report is at least queued.
  callback.Run(true, std::string());
}

void FeedbackService::QueueExistingReport(const std::string& data) {
  uploader_->QueueReport(data);
}


DbusFeedbackServiceImpl::DbusFeedbackServiceImpl(
    feedback::FeedbackUploader* uploader) : FeedbackService(uploader) {}

DbusFeedbackServiceImpl::~DbusFeedbackServiceImpl() {}

bool DbusFeedbackServiceImpl::Start(dbus::Bus* bus) {
  if (!bus || !bus->Connect()) {
    LOG(ERROR) << "Failed to connect to DBus";
    return false;
  }

  dbus::ObjectPath path(feedback::kFeedbackServicePath);
  dbus::ExportedObject *object = bus->GetExportedObject(path);
  if (!object) {
    LOG(ERROR) << "Failed to get exported object at " << path.value();
    return false;
  }

  if (!object->ExportMethodAndBlock(
          feedback::kFeedbackServiceName,
          feedback::kSendFeedback,
          base::Bind(&DbusFeedbackServiceImpl::DbusSendFeedback,
                     this))) {
    bus->UnregisterExportedObject(path);
    LOG(ERROR) << "Failed to export method " << feedback::kSendFeedback;
    return false;
  }
  if (!bus->RequestOwnershipAndBlock(feedback::kFeedbackServiceName,
                                      dbus::Bus::REQUIRE_PRIMARY)) {
    bus->UnregisterExportedObject(path);
    LOG(ERROR) << "Failed to get ownership of " <<
        feedback::kFeedbackServiceName;
    return false;
  }
  return true;
}

void DbusFeedbackServiceImpl::DbusSendFeedback(
    dbus::MethodCall* method_call,
    dbus::ExportedObject::ResponseSender sender) {
  dbus::MessageReader reader(method_call);
  userfeedback::ExtensionSubmit in;
  if (!reader.PopArrayOfBytesAsProto(&in)) {
    LOG(ERROR) << "Got feedback request with bad param";
    DbusFeedbackSent(method_call, sender, false,
        "Can't deserialize proto of type userfeedback::ExtensionSubmit");
  } else {
    LOG(INFO) << "Sending feedback";
    SendFeedback(in, base::Bind(&DbusFeedbackServiceImpl::DbusFeedbackSent,
                                this, method_call, sender));
  }
}

void DbusFeedbackServiceImpl::DbusFeedbackSent(
    dbus::MethodCall* method_call,
    dbus::ExportedObject::ResponseSender sender,
    bool status, const std::string& reason) {
  scoped_ptr<dbus::Response> response =
      dbus::Response::FromMethodCall(method_call);
  dbus::MessageWriter writer(response.get());
  writer.AppendBool(status);
  writer.AppendString(reason);
  sender.Run(response.Pass());
}
}  // namespace feedback
