#ifndef THIRD_PARTY_MILOTIC_EXTERNAL_CC_TLBMC_HTTP_HTTP_CLIENT_INTERFACE_H_
#define THIRD_PARTY_MILOTIC_EXTERNAL_CC_TLBMC_HTTP_HTTP_CLIENT_INTERFACE_H_

#include <cstddef>
#include <string>
#include <string_view>

#include "absl/functional/any_invocable.h"
#include "absl/status/status.h"
#include "boost/asio.hpp"  //NOLINT: boost::asio is commonly used in BMC
#include "boost/asio/error.hpp"  // NOLINT
#include "boost/asio/random_access_file.hpp"  // NOLINT: boost::asio is commonly used in BMC
#include "boost/beast/core.hpp"  // NOLINT: boost::beast is commonly used in BMC
#include "boost/beast/http.hpp"  // NOLINT: boost::beast is commonly used in BMC
#include "boost/beast/version.hpp"  // NOLINT: boost::beast is commonly used in BMC
#include "boost/filesystem.hpp"  // NOLINT: boost::filesystem is commonly used in BMC
#include "boost/filesystem/operations.hpp"  // NOLINT
#include "boost/system/detail/error_code.hpp"  // NOLINT: boost::asio is commonly used in BMC

namespace milotic_tlbmc {

class HttpClientInterface {
 public:
  HttpClientInterface() = default;
  virtual ~HttpClientInterface() = default;

  // ScanJob is a struct that holds the target URI and callback for the job. The
  // current HttpClient implementation only supports one active ScanJob at a
  // time.
  struct ScanJob {
    // Networking objects
    boost::beast::http::request<boost::beast::http::string_body> req;
    boost::beast::http::response<boost::beast::http::string_body> res;

    // Target URI to send the request to.
    std::string target;

    // Callback for the job's final completion
    absl::AnyInvocable<void(
        boost::beast::error_code,
        boost::beast::http::response<boost::beast::http::string_body>)>
        callback;
  };

  // Returns true if there is an active job running, indicating http client is
  // busy.
  virtual bool IsActive() = 0;

  // Sends a request to the given host, port, target, io_context and callback.
  // Returns true if the request is sent successfully, false otherwise.
  virtual void SendRequest(
      std::string_view host, std::string_view port, std::string_view target,
      bool use_tls,
      absl::AnyInvocable<
          void(boost::beast::error_code,
               boost::beast::http::response<boost::beast::http::string_body>)>
          callback) = 0;

  virtual void DownloadFile(
      std::string_view host, std::string_view port, std::string_view target,
      bool use_tls, std::string_view destination_path,
      absl::AnyInvocable<
          void(boost::beast::error_code,
               boost::beast::http::response<boost::beast::http::empty_body>)>
          callback,
      absl::AnyInvocable<void(std::size_t bytes_downloaded,
                              std::size_t bytes_written,
                              std::size_t content_length)>
          progress_callback) = 0;

  // Resolve the host and port from ScanJob.
  virtual void OnResolve(
      boost::beast::error_code ec,
      boost::asio::ip::tcp::resolver::results_type results) = 0;

  // Connect to the resolved IP address.
  virtual void OnConnect(
      boost::beast::error_code ec,
      boost::asio::ip::tcp::resolver::results_type::endpoint_type endpoint) = 0;

  // Write the request to the stream.
  virtual void OnWrite(boost::beast::error_code ec,
                       std::size_t bytes_transferred) = 0;

  // Read the response from the stream.
  virtual void OnRead(boost::beast::error_code ec,
                      std::size_t bytes_transferred) = 0;
};
}  // namespace milotic_tlbmc

#endif  // THIRD_PARTY_MILOTIC_EXTERNAL_CC_TLBMC_HTTP_HTTP_CLIENT_INTERFACE_H_
