#include "tlbmc/redfish/routes/task_service.h"

#include <filesystem>  // NOLINT
#include <fstream>
#include <ios>
#include <iterator>
#include <string>

#include "absl/functional/bind_front.h"
#include "absl/status/status.h"
#include "absl/strings/str_cat.h"
#include "absl/strings/string_view.h"
#include "nlohmann/json.hpp"
#include "json_utils.h"
#include "tlbmc/redfish/app.h"
#include "tlbmc/redfish/request.h"
#include "tlbmc/redfish/response.h"

namespace milotic_tlbmc::task_service {

namespace {

constexpr absl::string_view kInstallOngoingFile = "run/install/install_ongoing";
constexpr absl::string_view kProgressStatusPath =
    "var/google/install/progress_status.json";

void HandleFirmwareUpdateTask(const std::string& root_path,
                              const RedfishRequest& req,
                              RedfishResponse& resp) {
  resp.SetKeyInJsonBody("/@odata.type", "#Task.v1_4_2.Task");
  resp.SetKeyInJsonBody("/@odata.id",
                        "/redfish/v1/TaskService/Tasks/FirmwareBundleUpdate");
  resp.SetKeyInJsonBody("/Id", "FirmwareBundleUpdate");
  resp.SetKeyInJsonBody("/Name", "Firmware Bundle Update");

  // Set default values for the task state and percent completed.
  resp.SetKeyInJsonBody("/TaskState", "New");

  const std::filesystem::path status_file_path =
      std::filesystem::path(root_path) / std::string(kProgressStatusPath);

  std::ifstream status_file(status_file_path, std::ios::binary);

  std::string content((std::istreambuf_iterator<char>(status_file)),
                      std::istreambuf_iterator<char>());
  if (!status_file.good()) {
    resp.SetToInternalError(absl::StrCat(
        "Failed to read status file: ", status_file_path.c_str()));
    return;
  }

  nlohmann::json status_json = nlohmann::json::parse(content, nullptr, false);
  if (status_json.is_discarded()) {
    resp.SetToInternalError(absl::StrCat(
        "Failed to parse status file as JSON: ", kProgressStatusPath));
    return;
  }

// LINT.IfChange
  if (const auto* percent_complete =
          milotic::authz::GetValueAsInt(status_json, "percent_complete");
      percent_complete != nullptr) {
    resp.SetKeyInJsonBody("/PercentComplete", *percent_complete);
  }
  if (const auto* start_time =
          milotic::authz::GetValueAsString(status_json, "start_time");
      start_time != nullptr) {
    resp.SetKeyInJsonBody("/StartTime", *start_time);
  }
  if (const auto* task_state =
          milotic::authz::GetValueAsString(status_json, "status");
      task_state != nullptr) {
    resp.SetKeyInJsonBody("/TaskState", *task_state);
  }
// LINT.ThenChange(//depot/google3/third_party/milotic/external/cc/bloom_install/installer.cc)
}

void HandleTaskService(const RedfishRequest& req, RedfishResponse& resp) {
  resp.SetKeyInJsonBody("/@odata.id", "/redfish/v1/TaskService");
  resp.SetKeyInJsonBody("/@odata.type", "#TaskService.v1_2_0.TaskService");
  resp.SetKeyInJsonBody("/Tasks", "/redfish/v1/TaskService/Tasks");
}

void HandleTaskCollection(const RedfishRequest& req, RedfishResponse& resp) {
  resp.SetKeyInJsonBody("/@odata.id", "/redfish/v1/TaskService/Tasks");
  resp.SetKeyInJsonBody("/@odata.type", "#TaskCollection.TaskCollection");
  resp.SetKeyInJsonBody("/Members@odata.count", 1);
  resp.SetKeyInJsonBody("/Members",
                        nlohmann::json::array({"/redfish/v1/TaskService/Tasks/"
                                               "FirmwareBundleUpdate"}));
}

}  // namespace

void RegisterRoutes(RedfishApp& app) {
  TLBMC_ROUTE(app, "/redfish/v1/TaskService/")
      .methods(boost::beast::http::verb::get)(HandleTaskService);
  TLBMC_ROUTE(app, "/redfish/v1/TaskService/Tasks/")
      .methods(boost::beast::http::verb::get)(HandleTaskCollection);
  TLBMC_ROUTE(app, "/redfish/v1/TaskService/Tasks/FirmwareBundleUpdate/")
      .methods(boost::beast::http::verb::get)(
          absl::bind_front(HandleFirmwareUpdateTask, "/"));
}

void RegisterRoutesForUnitTest(
    RedfishApp& app, const std::string& install_inventory_path_prefix) {
  TLBMC_ROUTE(app, "/redfish/v1/TaskService/")
      .methods(boost::beast::http::verb::get)(HandleTaskService);
  TLBMC_ROUTE(app, "/redfish/v1/TaskService/Tasks/")
      .methods(boost::beast::http::verb::get)(HandleTaskCollection);
  TLBMC_ROUTE(app, "/redfish/v1/TaskService/Tasks/FirmwareBundleUpdate/")
      .methods(boost::beast::http::verb::get)(
          absl::bind_front(HandleFirmwareUpdateTask,
                           std::string(install_inventory_path_prefix)));
}

}  // namespace milotic_tlbmc::task_service
