// Copyright 2016 The Fuchsia 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 PERIDOT_LIB_FIREBASE_EVENT_STREAM_H_
#define PERIDOT_LIB_FIREBASE_EVENT_STREAM_H_

#include <functional>
#include <memory>
#include <string>

#include <lib/callback/destruction_sentinel.h>
#include <lib/fit/function.h>
#include <lib/fsl/socket/socket_drainer.h>
#include <src/lib/fxl/macros.h>
#include <src/lib/fxl/strings/string_view.h>

#include "peridot/lib/firebase/status.h"

namespace firebase {

// TODO(ppi): Use a client interface instead.
using EventCallback = void(Status status, const std::string& event, const std::string& data);
using CompletionCallback = void();

// Socket drainer that parses a stream of Server-Sent Events.
// Data format of the stream is specified in http://www.w3.org/TR/eventsource/.
class EventStream : public fsl::SocketDrainer::Client {
 public:
  EventStream();
  ~EventStream() override;

  void Start(zx::socket source, fit::function<EventCallback> event_callback,
             fit::function<CompletionCallback> completion_callback);

 private:
  friend class EventStreamTest;

  // fsl::SocketDrainer::Client:
  void OnDataAvailable(const void* data, size_t num_bytes) override;
  void OnDataComplete() override;

  // Returns false if the object has been destroyed within this method.
  bool ProcessLine(fxl::StringView line);

  void ProcessField(fxl::StringView field, fxl::StringView value);

  fit::function<EventCallback> event_callback_;
  fit::function<CompletionCallback> completion_callback_;

  // Unprocessed part of the current line.
  std::string pending_line_;
  std::string data_;
  std::string event_type_;

  std::unique_ptr<fsl::SocketDrainer> drainer_;

  callback::DestructionSentinel destruction_sentinel_;

  FXL_DISALLOW_COPY_AND_ASSIGN(EventStream);
};

}  // namespace firebase

#endif  // PERIDOT_LIB_FIREBASE_EVENT_STREAM_H_
