#include "utils/subprocess_utils.hpp"

#include "async_resp.hpp"
#include "error_messages.hpp"
#include "managed_store.hpp"
#include "test/g3/mock_managed_store.hpp"
#include <boost/process.hpp>
#include <boost/system/error_code.hpp>

#include <memory>
#include <string>


namespace redfish
{

void childProcessRun(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
                       const std::vector<std::string>& resetCmd)
{
    std::stringstream ss;
    bool skipFirst = true;
    for (const auto& str : resetCmd) {
      if (skipFirst){
        skipFirst = false;
      }
      else{
        ss << " ";
      }
      ss << str;
    }

    BMCWEB_LOG_ALWAYS << "reset string:"<< ss.str();
    std::shared_ptr<std::vector<char>> buf =
        std::make_shared<std::vector<char>>(4096);
    std::shared_ptr<boost::process::async_pipe> ap =
        std::make_shared<boost::process::async_pipe>(
            managedStore::GetManagedObjectStore()->GetIoContext());
    std::shared_ptr<boost::process::child> childProcess =
        std::make_shared<boost::process::child>(
            boost::process::search_path("systemd-run"), boost::process::args(resetCmd),
            boost::process::std_err > *ap);
    boost::asio::async_read(*ap, boost::asio::buffer(*buf),
                            [ap, buf, asyncResp, childProcess](
                                const boost::system::error_code& ec, int size) {
        if (ec && ec != boost::asio::error::eof)
        {
            BMCWEB_LOG_ERROR << "Error in child process: " << ec.message();
            messages::internalError(asyncResp->res);
            return;
        }
        int exit = childProcess->exit_code();
        BMCWEB_LOG_DEBUG << "Child process exited with code: " << exit;
        asyncResp->res.jsonValue["ReturnCode"] = exit;
        if (size != 0 && size <= static_cast<int>(buf->size()))
        {
            asyncResp->res.jsonValue["Output"] =
                std::string(buf->begin(), std::next(buf->begin(), size));
        }
        messages::success(asyncResp->res);
    });
    #ifdef UNIT_TEST_BUILD
    asyncResp->res.jsonValue["ResetString"] = ss.str();  // used by unit test
    #endif
}

} // namespace redfish

