// Copyright 2018 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 "vm_tools/notificationd/dbus_service.h"

#include <map>
#include <string>
#include <utility>
#include <vector>

#include <base/bind.h>
#include <base/memory/ptr_util.h>

namespace {

const char kNotificationsServiceName[] = "org.freedesktop.Notifications";
const char kNotificationsServicePath[] = "/org/freedesktop/Notifications";

void HandleSynchronousDBusMethodCall(
    base::Callback<std::unique_ptr<dbus::Response>(dbus::MethodCall*)> handler,
    dbus::MethodCall* method_call,
    dbus::ExportedObject::ResponseSender response_sender) {
  auto response = handler.Run(method_call);
  if (!response)
    response = dbus::Response::FromMethodCall(method_call);

  response_sender.Run(std::move(response));
}

std::unique_ptr<dbus::ErrorResponse> GetErrorResponseWithLog(
    dbus::MethodCall* method_call,
    const std::string& type,
    const std::string& message) {
  LOG(ERROR) << message;
  return dbus::ErrorResponse::FromMethodCall(method_call, type, message);
}

bool PopStringArray(dbus::MessageReader* reader,
                    std::vector<std::string>* value) {
  dbus::MessageReader array_reader(nullptr);
  if (!reader->PopArray(&array_reader))
    return false;

  while (array_reader.HasMoreData()) {
    std::string data;
    if (!array_reader.PopString(&data))
      return false;
    value->push_back(std::move(data));
  }
  return true;
}

bool PopStringVariantDict(dbus::MessageReader* reader,
                          std::map<std::string, std::string>* value) {
  dbus::MessageReader array_reader(nullptr);
  if (!reader->PopArray(&array_reader))
    return false;

  while (array_reader.HasMoreData()) {
    dbus::MessageReader dict_entry_reader(nullptr);
    if (!array_reader.PopDictEntry(&dict_entry_reader))
      return false;
    // We just skip to parse entries because thier values (not key) may contain
    // complex variant parameters.
    // TODO(toshikikikuchi): Add reader for variant parameters.
  }
  return true;
}

}  // namespace

namespace vm_tools {
namespace notificationd {

DBusService::DBusService(DBusInterface* interface) : interface_(interface) {}

// static
std::unique_ptr<DBusService> DBusService::Create(DBusInterface* interface) {
  auto service = base::WrapUnique(new DBusService(interface));

  if (!service->Init())
    return nullptr;

  return service;
}

void DBusService::SendNotificationClosedSignal(uint32_t id,
                                               ClosedReason reason) {
  dbus::Signal signal(kNotificationsServiceName, "NotificationClosed");
  dbus::MessageWriter writer(&signal);
  writer.AppendUint32(id);
  writer.AppendUint32(static_cast<uint32_t>(reason));
  exported_object_->SendSignal(&signal);
}

void DBusService::SendActionInvokedSignal(uint32_t id,
                                          const std::string& action_key) {
  dbus::Signal signal(kNotificationsServiceName, "ActionInvoked");
  dbus::MessageWriter writer(&signal);
  writer.AppendUint32(id);
  writer.AppendString(action_key);
  exported_object_->SendSignal(&signal);
}

bool DBusService::RegisterMethods() {
  using ServiceMethod =
      std::unique_ptr<dbus::Response> (DBusService::*)(dbus::MethodCall*);
  const std::map<const char*, ServiceMethod> kServiceMethods = {
      {"GetCapabilities", &DBusService::CallGetCapabilities},
      {"Notify", &DBusService::CallNotify},
      {"GetServerInformation", &DBusService::CallGetServerInformation},
      {"CloseNotification", &DBusService::CallCloseNotification},
  };

  for (const auto& iter : kServiceMethods) {
    const bool ret = exported_object_->ExportMethodAndBlock(
        kNotificationsServiceName, iter.first,
        base::Bind(&HandleSynchronousDBusMethodCall,
                   base::Bind(iter.second, base::Unretained(this))));
    if (!ret) {
      LOG(ERROR) << "Failed to export method " << iter.first;
      return false;
    }
  }

  return true;
}

std::unique_ptr<dbus::Response> DBusService::CallGetCapabilities(
    dbus::MethodCall* method_call) {
  std::unique_ptr<dbus::Response> dbus_response(
      dbus::Response::FromMethodCall(method_call));

  std::vector<std::string> out_capabilities;
  if (!interface_->GetCapabilities(&out_capabilities)) {
    return GetErrorResponseWithLog(method_call, DBUS_ERROR_FAILED,
                                   "Failed to call GetCapabilities");
  }

  dbus::MessageWriter writer(dbus_response.get());
  dbus::MessageWriter array_writer(nullptr);
  writer.OpenArray(DBUS_TYPE_STRING_AS_STRING, &array_writer);
  for (const auto& cap : out_capabilities) {
    array_writer.AppendString(cap);
  }
  writer.CloseContainer(&array_writer);

  return dbus_response;
}

std::unique_ptr<dbus::Response> DBusService::CallNotify(
    dbus::MethodCall* method_call) {
  std::unique_ptr<dbus::Response> dbus_response(
      dbus::Response::FromMethodCall(method_call));

  dbus::MessageReader reader(method_call);
  DBusInterface::NotifyArgument input;

  const auto valid_args = reader.PopString(&input.app_name) &&
                          reader.PopUint32(&input.replaces_id) &&
                          reader.PopString(&input.app_icon) &&
                          reader.PopString(&input.summary) &&
                          reader.PopString(&input.body) &&
                          PopStringArray(&reader, &input.actions) &&
                          PopStringVariantDict(&reader, &input.hints) &&
                          reader.PopInt32(&input.expire_timeout);

  if (!valid_args) {
    return GetErrorResponseWithLog(method_call, DBUS_ERROR_INVALID_ARGS,
                                   "Invalid args for Notify");
  }

  uint32_t out_id;
  if (!interface_->Notify(input, &out_id)) {
    return GetErrorResponseWithLog(method_call, DBUS_ERROR_FAILED,
                                   "Failed to call Notify");
  }

  dbus::MessageWriter writer(dbus_response.get());
  writer.AppendUint32(out_id);

  return dbus_response;
}

std::unique_ptr<dbus::Response> DBusService::CallGetServerInformation(
    dbus::MethodCall* method_call) {
  std::unique_ptr<dbus::Response> dbus_response(
      dbus::Response::FromMethodCall(method_call));

  DBusInterface::ServerInformation output;

  if (!interface_->GetServerInformation(&output)) {
    return GetErrorResponseWithLog(method_call, DBUS_ERROR_FAILED,
                                   "Failed to call GetServerInformation");
  }

  dbus::MessageWriter writer(dbus_response.get());
  writer.AppendString(std::move(output.name));
  writer.AppendString(std::move(output.vendor));
  writer.AppendString(std::move(output.version));
  writer.AppendString(std::move(output.spec_version));

  return dbus_response;
}

std::unique_ptr<dbus::Response> DBusService::CallCloseNotification(
    dbus::MethodCall* method_call) {
  std::unique_ptr<dbus::Response> dbus_response(
      dbus::Response::FromMethodCall(method_call));

  dbus::MessageReader reader(method_call);

  uint32_t id = 0;
  if (!reader.PopUint32(&id)) {
    return GetErrorResponseWithLog(method_call, DBUS_ERROR_INVALID_ARGS,
                                   "Invalid args for CloseNotification");
  }

  if (!interface_->CloseNotification(id)) {
    return GetErrorResponseWithLog(method_call, DBUS_ERROR_FAILED,
                                   "Failed to call CloseNotification");
  }

  return dbus_response;
}

bool DBusService::Init() {
  bus_ = new dbus::Bus(dbus::Bus::Options());
  if (!bus_->Connect()) {
    LOG(ERROR) << "Failed to connect to session bus";
    return false;
  }

  exported_object_ =
      bus_->GetExportedObject(dbus::ObjectPath(kNotificationsServicePath));
  if (!exported_object_) {
    LOG(ERROR) << "Failed to export " << kNotificationsServicePath << " object";
    return false;
  }

  if (!RegisterMethods()) {
    LOG(ERROR) << "Failed to export methods";
    return false;
  }

  if (!bus_->RequestOwnershipAndBlock(kNotificationsServiceName,
                                      dbus::Bus::REQUIRE_PRIMARY)) {
    LOG(ERROR) << "Unable to take ownership of " << kNotificationsServiceName;
    return false;
  }

  return true;
}

}  // namespace notificationd
}  // namespace vm_tools
