// 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_SOCKET_SOCKET_WRITER_H_
#define PERIDOT_LIB_SOCKET_SOCKET_WRITER_H_

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

#include <lib/async/cpp/wait.h>
#include <lib/async/default.h>
#include <lib/fit/function.h>
#include <src/lib/fxl/macros.h>
#include <src/lib/fxl/strings/string_view.h>
#include <lib/zx/socket.h>

namespace socket {

// Requests data to write from its client. Interrupts itself and closes the
// socket when deleted.
class SocketWriter {
 public:
  class Client {
   public:
    virtual void GetNext(size_t offset, size_t max_size,
                         fit::function<void(fxl::StringView)> callback) = 0;
    virtual void OnDataComplete() = 0;

   protected:
    virtual ~Client() {}
  };

  explicit SocketWriter(Client* client, async_dispatcher_t* dispatcher =
                                            async_get_default_dispatcher());
  ~SocketWriter();

  void Start(zx::socket destination);

 private:
  void GetData();
  void WriteData(fxl::StringView data);
  void Done();

  Client* const client_;
  async_dispatcher_t* const dispatcher_;
  // Position of the next byte to request.
  size_t offset_ = 0u;
  // Data left to send from last call to |GetNext|.
  std::string data_;
  // Data left to send.
  fxl::StringView data_view_;
  zx::socket destination_;
  async::Wait wait_;

  FXL_DISALLOW_COPY_AND_ASSIGN(SocketWriter);
};

// Writes the content of a string to a socket. Deletes itself when done.
class StringSocketWriter : public SocketWriter::Client {
 public:
  explicit StringSocketWriter(
      async_dispatcher_t* dispatcher = async_get_default_dispatcher());

  void Start(std::string data, zx::socket destination);

 private:
  void GetNext(size_t offset, size_t max_size,
               fit::function<void(fxl::StringView)> callback) override;
  void OnDataComplete() override;

  SocketWriter socket_writer_;
  std::string data_;
};

}  // namespace socket

#endif  // PERIDOT_LIB_SOCKET_SOCKET_WRITER_H_
