// Copyright 2015 The Weave 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 "src/notification/notification_parser.h"

#include <base/logging.h>

namespace weave {

namespace {

// Processes COMMAND_CREATED notifications.
bool ParseCommandCreated(const base::DictionaryValue& notification,
                         NotificationDelegate* delegate,
                         const std::string& channel_name) {
  const base::DictionaryValue* command = nullptr;
  if (!notification.GetDictionary("command", &command)) {
    LOG(ERROR) << "COMMAND_CREATED notification is missing 'command' property";
    return false;
  }

  delegate->OnCommandCreated(*command, channel_name);
  return true;
}

// Processes DEVICE_DELETED notifications.
bool ParseDeviceDeleted(const base::DictionaryValue& notification,
                        NotificationDelegate* delegate) {
  std::string cloud_id;
  if (!notification.GetString("deviceId", &cloud_id)) {
    LOG(ERROR) << "DEVICE_DELETED notification is missing 'deviceId' property";
    return false;
  }

  delegate->OnDeviceDeleted(cloud_id);
  return true;
}

}  // anonymous namespace

bool ParseNotificationJson(const base::DictionaryValue& notification,
                           NotificationDelegate* delegate,
                           const std::string& channel_name) {
  CHECK(delegate);

  std::string kind;
  if (!notification.GetString("kind", &kind) ||
      kind != "clouddevices#notification") {
    LOG(WARNING) << "Push notification should have 'kind' property set to "
                    "clouddevices#notification";
    return false;
  }

  std::string type;
  if (!notification.GetString("type", &type)) {
    LOG(WARNING) << "Push notification should have 'type' property";
    return false;
  }

  if (type == "COMMAND_CREATED")
    return ParseCommandCreated(notification, delegate, channel_name);

  if (type == "DEVICE_DELETED")
    return ParseDeviceDeleted(notification, delegate);

  // Here we ignore other types of notifications for now.
  LOG(INFO) << "Ignoring push notification of type " << type;
  return true;
}

}  // namespace weave
