// Copyright 2018 The Chromium 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 "components/invalidation/impl/fcm_sync_network_channel.h"

namespace syncer {

FCMSyncNetworkChannel::FCMSyncNetworkChannel() : received_messages_count_(0) {}

FCMSyncNetworkChannel::~FCMSyncNetworkChannel() {}

void FCMSyncNetworkChannel::SetMessageReceiver(
    MessageCallback incoming_receiver) {
  incoming_receiver_ = std::move(incoming_receiver);
}

void FCMSyncNetworkChannel::SetTokenReceiver(TokenCallback token_receiver) {
  token_receiver_ = token_receiver;
  if (!token_.empty())
    token_receiver_.Run(token_);
}

void FCMSyncNetworkChannel::AddObserver(Observer* observer) {
  observers_.AddObserver(observer);
}

void FCMSyncNetworkChannel::RemoveObserver(Observer* observer) {
  observers_.RemoveObserver(observer);
}

void FCMSyncNetworkChannel::NotifyChannelStateChange(FcmChannelState state) {
  for (auto& observer : observers_)
    observer.OnFCMChannelStateChanged(state);
}

bool FCMSyncNetworkChannel::DeliverIncomingMessage(
    const std::string& payload,
    const std::string& private_topic,
    const std::string& public_topic,
    const std::string& version) {
  if (!incoming_receiver_) {
    DLOG(ERROR) << "No receiver for incoming notification";
    return false;
  }
  received_messages_count_++;
  incoming_receiver_.Run(payload, private_topic, public_topic, version);
  return true;
}

bool FCMSyncNetworkChannel::DeliverToken(const std::string& token) {
  token_ = token;
  if (!token_receiver_) {
    DLOG(ERROR) << "No receiver for token";
    return false;
  }
  token_receiver_.Run(token_);
  return true;
}

int FCMSyncNetworkChannel::GetReceivedMessagesCount() const {
  return received_messages_count_;
}

void FCMSyncNetworkChannel::RequestDetailedStatus(
    base::Callback<void(const base::DictionaryValue&)> callback) {}

}  // namespace syncer
