// Copyright 2020 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 "remoting/host/ftl_echo_message_listener.h"

#include "base/logging.h"
#include "remoting/base/logging.h"
#include "remoting/proto/ftl/v1/chromoting_message.pb.h"
#include "remoting/proto/ftl/v1/ftl_messages.pb.h"
#include "remoting/signaling/signaling_address.h"

namespace {
constexpr int kMaxEchoMessageLength = 16;
}

namespace remoting {

FtlEchoMessageListener::FtlEchoMessageListener(std::string host_owner,
                                               SignalStrategy* signal_strategy)
    : host_owner_(host_owner), signal_strategy_(signal_strategy) {
  DCHECK(signal_strategy_);
  signal_strategy_->AddListener(this);
}

FtlEchoMessageListener::~FtlEchoMessageListener() {
  signal_strategy_->RemoveListener(this);
}

void FtlEchoMessageListener::OnSignalStrategyStateChange(
    SignalStrategy::State state) {}

bool FtlEchoMessageListener::OnSignalStrategyIncomingStanza(
    const jingle_xmpp::XmlElement* stanza) {
  return false;
}

bool FtlEchoMessageListener::OnSignalStrategyIncomingMessage(
    const ftl::Id& sender_id,
    const std::string& sender_registration_id,
    const ftl::ChromotingMessage& request_message) {
  if (!request_message.has_echo() || !request_message.echo().has_message()) {
    return false;
  }

  // Only respond to echo messages from the machine owner.
  if (sender_id.type() != ftl::IdType_Type_EMAIL ||
      sender_id.id() != host_owner_) {
    LOG(WARNING) << "Dropping echo message from " << sender_id.id();
    return false;
  }

  std::string request_message_payload(request_message.echo().message());
  HOST_LOG << "Handling echo message: '" << request_message_payload << "'";

  std::string response_message_payload =
      request_message_payload.substr(0, kMaxEchoMessageLength);
  ftl::ChromotingMessage response_message;
  response_message.mutable_echo()->set_message(response_message_payload);

  signal_strategy_->SendMessage(SignalingAddress::CreateFtlSignalingAddress(
                                    sender_id.id(), sender_registration_id),
                                response_message);

  return true;
}

}  // namespace remoting
