// Copyright 2015 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.

#ifndef BUFFET_NOTIFICATION_XMPP_CHANNEL_H_
#define BUFFET_NOTIFICATION_XMPP_CHANNEL_H_

#include <map>
#include <memory>
#include <string>
#include <vector>

#include <base/callback_forward.h>
#include <base/macros.h>
#include <base/memory/weak_ptr.h>
#include <base/task_runner.h>
#include <chromeos/backoff_entry.h>
#include <chromeos/streams/stream.h>

#include "buffet/notification/notification_channel.h"
#include "buffet/notification/xmpp_stream_parser.h"

namespace buffet {

class XmppChannel : public NotificationChannel,
                    public XmppStreamParser::Delegate {
 public:
  // |account| is the robot account for buffet and |access_token|
  // it the OAuth token. Note that the OAuth token expires fairly frequently
  // so you will need to reset the XmppClient every time this happens.
  XmppChannel(const std::string& account,
              const std::string& access_token,
              const scoped_refptr<base::TaskRunner>& task_runner);
  ~XmppChannel() override = default;

  // Overrides from NotificationChannel.
  std::string GetName() const override;
  bool IsConnected() const override;
  void AddChannelParameters(base::DictionaryValue* channel_json) override;
  void Start(NotificationDelegate* delegate) override;
  void Stop() override;

  // Internal states for the XMPP stream.
  enum class XmppState {
    kNotStarted,
    kStarted,
    kTlsStarted,
    kTlsCompleted,
    kAuthenticationStarted,
    kAuthenticationFailed,
    kStreamRestartedPostAuthentication,
    kBindSent,
    kSessionStarted,
    kSubscribeStarted,
    kSubscribed,
  };

 protected:
  virtual void Connect(const std::string& host, uint16_t port,
                       const base::Closure& callback);

  XmppState state_{XmppState::kNotStarted};

  // The connection socket stream to the XMPP server.
  chromeos::Stream* stream_{nullptr};

 private:
  // Overrides from XmppStreamParser::Delegate.
  void OnStreamStart(const std::string& node_name,
                     std::map<std::string, std::string> attributes) override;
  void OnStreamEnd(const std::string& node_name) override;
  void OnStanza(std::unique_ptr<XmlNode> stanza) override;

  void HandleStanza(std::unique_ptr<XmlNode> stanza);
  void HandleMessageStanza(std::unique_ptr<XmlNode> stanza);
  void RestartXmppStream();

  void StartTlsHandshake();
  void OnTlsHandshakeComplete(chromeos::StreamPtr tls_stream);
  void OnTlsError(const chromeos::Error* error);

  void SendMessage(const std::string& message);
  void WaitForMessage();

  void OnConnected();
  void OnMessageRead(size_t size);
  void OnMessageSent();
  void OnReadError(const chromeos::Error* error);
  void OnWriteError(const chromeos::Error* error);
  void Restart();

  // Robot account name for the device.
  std::string account_;

  // OAuth access token for the account. Expires fairly frequently.
  std::string access_token_;

  chromeos::StreamPtr raw_socket_;
  chromeos::StreamPtr tls_stream_;  // Must follow |raw_socket_|.

  // Read buffer for incoming message packets.
  std::vector<char> read_socket_data_;
  // Write buffer for outgoing message packets.
  std::string write_socket_data_;
  std::string queued_write_data_;

  // XMPP server name and port used for connection.
  std::string host_;
  uint16_t port_{0};

  chromeos::BackoffEntry backoff_entry_;
  NotificationDelegate* delegate_{nullptr};
  scoped_refptr<base::TaskRunner> task_runner_;
  XmppStreamParser stream_parser_{this};
  bool read_pending_{false};
  bool write_pending_{false};

  base::WeakPtrFactory<XmppChannel> weak_ptr_factory_{this};
  DISALLOW_COPY_AND_ASSIGN(XmppChannel);
};

}  // namespace buffet

#endif  // BUFFET_NOTIFICATION_XMPP_CHANNEL_H_

