#ifndef PRODUCTION_SUSHID_SAFEPOWER_AGENT_BMC_HTTP_CONNECTION_H_
#define PRODUCTION_SUSHID_SAFEPOWER_AGENT_BMC_HTTP_CONNECTION_H_
#include <nlohmann/json.hpp>

#include "absl/status/status.h"
#include "absl/status/statusor.h"

#include "absl/functional/any_invocable.h"

#include "boost/asio/ip/tcp.hpp"  // NOLINT
#include "boost/asio/ssl.hpp"  // NOLINT
#include "boost/asio/ssl/stream.hpp"  // NOLINT
#include "boost/beast/core.hpp"  // NOLINT
#include "boost/beast/core/tcp_stream.hpp"  // NOLINT
#include "boost/beast/http.hpp"  // NOLINT
#include "boost/beast/version.hpp"  // NOLINT

namespace safepower_agent {

namespace beast = boost::beast;
namespace http = beast::http;

using boost::beast::tcp_stream;

class HttpConnection : public std::enable_shared_from_this<HttpConnection> {
 public:
    HttpConnection(absl::Duration connection_timeout =
                      absl::Seconds(10),
                 absl::Duration write_timeout =
                      absl::Seconds(10));

    void PerformConnection(http::verb verb,
                        absl::string_view target,
                        absl::AnyInvocable
                                 <void(absl::StatusOr<nlohmann::json>) && >
                           callback,
                        const nlohmann::json& body,
                        absl::string_view ip = "127.0.0.1",
                        const uint16_t port = 80);

    void Write(beast::error_code ec);
    void Read(beast::error_code ec,
                     size_t bytes_transferred);
    void Callback(beast::error_code ec,
                    std::size_t bytes_transferred);

 private:
    http::verb verb_;
    std::string target_;
    std::string body_;
    beast::tcp_stream  stream_;
    beast::flat_buffer buffer_;
    absl::AnyInvocable<void(absl::StatusOr<nlohmann::json>) &&>
        provided_callback_;
    http::request<http::string_body> req_;
    http::response<http::string_body> res_;
    boost::asio::ip::tcp::endpoint end_point_;
    absl::Duration connection_timeout_;
    absl::Duration write_timeout_;
};

}   // namespace safepower_agent

#endif  // PRODUCTION_SUSHID_SAFEPOWER_AGENT_BMC_HTTP_CONNECTION_H_

