#include "health.hpp"

#include <cstdint>
#include <memory>
#include <string>
#include <vector>

#include <gtest/gtest.h>
#include "http_response.hpp"
#include "dbus_utility.hpp"
#include "snapshot_fixture.hpp"
#include <nlohmann/json.hpp>
#include "managed_store.hpp"
#include "managed_store_types.hpp"
#include "test/g3/mock_managed_store.hpp"
#include "sdbusplus/message/native_types.hpp"

namespace redfish {
namespace {

using ::dbus::utility::DBusInteracesMap;
using ::dbus::utility::DBusPropertiesMap;
using ::dbus::utility::DbusVariantType;
using ::dbus::utility::ManagedObjectType;
using ::dbus::utility::MapperGetSubTreeResponse;
using ::dbus::utility::MapperServiceMap;
using ::managedStore::KeyType;
using ::managedStore::ManagedType;

TEST_F(SnapshotFixture, HealthPopulateFillsOkStatusWhenNoErrors) {
  dbus::utility::MapperGetSubTreePathsResponse healthPaths = {
      "/xyz/openbmc_project/inventory/system/board/LeakDetector_0/"
      "EMMC_PRSNT"};

  sdbusplus::message::object_path healthPathObj(healthPaths[0]);
  DBusPropertiesMap configProperties{
      {"Name", DbusVariantType("EMMC_PRSNT")},
      {"Severity", DbusVariantType("Critical")},
      {"BoardName", DbusVariantType("LeakDetector_0")},
      {"FailureMessageId",
       DbusVariantType("ResourceEvent.1.0.ResourceErrorsDetected")},
      {"OkMessageId",
       DbusVariantType("ResourceEvent.1.0.ResourceErrorsCorrected")},
      {"MessageArgs",
       DbusVariantType(std::vector<std::string>{"Fan0", "Efuse failure"})},
      {"Resolution", DbusVariantType("Replace")},
      {"RelatedEntityName", DbusVariantType("LeakDetector_0")},
      {"RelatedEntityType", DbusVariantType("Board")},
      {"ODataID", DbusVariantType("/redfish/v1/Chassis/LeakDetector_0")}};

  ASSERT_TRUE(
      dynamic_cast<managedStore::MockSerializedManagedObjectStore*>(
          managedStore::GetManagedObjectStore())
          ->upsertMockObjectIntoManagedStore(
              KeyType(ManagedType::kManagedPropertyMap,
                      "xyz.openbmc_project.EntityManager", healthPathObj,
                      "xyz.openbmc_project.Configuration.HealthMonitor"),
              CreateValueType(configProperties))
          .ok());

  DBusPropertiesMap statusProperties{
      {"healthy", DbusVariantType(true)},
      {"toggle_count", DbusVariantType(uint64_t{0})}};
  sdbusplus::message::object_path statusPath(
      "/xyz/openbmc_project/HealthMonitor/EMMC_PRSNT");
  ASSERT_TRUE(dynamic_cast<managedStore::MockSerializedManagedObjectStore*>(
                  managedStore::GetManagedObjectStore())
                  ->upsertMockObjectIntoManagedStore(
                      KeyType(ManagedType::kManagedPropertyMap,
                              "xyz.openbmc_project.HealthMonitor", statusPath,
                              "xyz.openbmc_project.HealthMonitor.GetStatus"),
                      CreateValueType(statusProperties))
                  .ok());
  auto health = std::make_shared<HealthPopulate>(share_async_resp_);
  health->populate();
  RunIoUntilDone();
  health.reset();    // Destroy HealthPopulate to trigger destructor
  RunIoUntilDone();  // Drain any callbacks posted by destructor

  nlohmann::json& json = share_async_resp_->res.jsonValue;
  EXPECT_EQ(json["Status"]["Health"], "OK");
  EXPECT_EQ(json["Status"]["HealthRollup"], "OK");
  EXPECT_EQ(share_async_resp_->res.result(), boost::beast::http::status::ok);
}

TEST_F(SnapshotFixture, HealthPopulateConditions) {
  dbus::utility::MapperGetSubTreePathsResponse healthPaths = {
      "/xyz/openbmc_project/inventory/system/board/LeakDetector_0/"
      "EMMC_PRSNT"};
  sdbusplus::message::object_path healthPathObj(healthPaths[0]);

  ASSERT_TRUE(dynamic_cast<managedStore::MockSerializedManagedObjectStore*>(
                  managedStore::GetManagedObjectStore())
                  ->upsertMockObjectIntoManagedStore(
                      KeyType(ManagedType::kManagedSubtreePaths,
                              "/xyz/openbmc_project/inventory", 0,
                              {"xyz.openbmc_project.Configuration."
                               "HealthMonitor"}),
                      CreateValueType(healthPaths))
                  .ok());

  DBusPropertiesMap configProperties{
      {"Name", DbusVariantType("EMMC_PRSNT")},
      {"Severity", DbusVariantType("Critical")},
      {"BoardName", DbusVariantType("LeakDetector_0")},
      {"FailureMessageId",
       DbusVariantType("ResourceEvent.1.0.ResourceErrorsDetected")},
      {"OkMessageId",
       DbusVariantType("ResourceEvent.1.0.ResourceErrorsCorrected")},
      {"MessageArgs",
       DbusVariantType(std::vector<std::string>{"Fan0", "Efuse failure"})},
      {"Resolution", DbusVariantType("Replace")},
      {"RelatedEntityName", DbusVariantType("LeakDetector_0")},
      {"RelatedEntityType", DbusVariantType("Board")},
      {"ODataID", DbusVariantType("/redfish/v1/Chassis/LeakDetector_0")}};

  ASSERT_TRUE(
      dynamic_cast<managedStore::MockSerializedManagedObjectStore*>(
          managedStore::GetManagedObjectStore())
          ->upsertMockObjectIntoManagedStore(
              KeyType(ManagedType::kManagedPropertyMap,
                      "xyz.openbmc_project.EntityManager", healthPathObj,
                      "xyz.openbmc_project.Configuration.HealthMonitor"),
              CreateValueType(configProperties))
          .ok());

  DBusPropertiesMap statusProperties{
      {"healthy", DbusVariantType(false)},
      {"toggle_count", DbusVariantType(uint64_t{1})}};
  sdbusplus::message::object_path statusPath(
      "/xyz/openbmc_project/HealthMonitor/EMMC_PRSNT");
  ASSERT_TRUE(dynamic_cast<managedStore::MockSerializedManagedObjectStore*>(
                  managedStore::GetManagedObjectStore())
                  ->upsertMockObjectIntoManagedStore(
                      KeyType(ManagedType::kManagedPropertyMap,
                              "xyz.openbmc_project.HealthMonitor", statusPath,
                              "xyz.openbmc_project.HealthMonitor.GetStatus"),
                      CreateValueType(statusProperties))
                  .ok());

  HealthStatusCache::getInstance().getHealthAttributes(healthPaths[0]);
  RunIoUntilDone();

  auto health = std::make_shared<HealthPopulate>(
      share_async_resp_, "/redfish/v1/Chassis/LeakDetector_0",
      "/xyz/openbmc_project/inventory/system/board/LeakDetector_0", "Board",
      "LeakDetector_0");
  health->populate();
  RunIoUntilDone();
  health.reset();  // Destroy HealthPopulate to trigger destructor

  nlohmann::json& json = share_async_resp_->res.jsonValue;
  EXPECT_EQ(json["Status"]["Health"], "Critical");
  EXPECT_EQ(json["Status"]["HealthRollup"], "Critical");
  ASSERT_EQ(json["Status"]["Conditions"].size(), 1);
  EXPECT_EQ(json["Status"]["Conditions"][0]["MessageId"],
            "ResourceEvent.1.0.ResourceErrorsDetected");
  EXPECT_EQ(json["Status"]["Conditions"][0]["Severity"], "Critical");
  EXPECT_EQ(share_async_resp_->res.result(), boost::beast::http::status::ok);
}

TEST_F(SnapshotFixture,
       HealthPopulateCorrectlyProcessesChildrenAndAssociations) {
  // This test is designed to improve code coverage by exercising complex
  // logic in the HealthPopulate destructor. It verifies the handling of:
  // - Direct child inventory items.
  // - Items associated with child inventory via 'endpoints'.
  // - A 'self' path health status.
  // - An item that is not a child and has no relevant association (should be
  // skipped).
  // - Malformed association data.

  auto health = std::make_shared<HealthPopulate>(share_async_resp_);

  // 1. Define inventory, including 'self' and 'child' items.
  const std::string selfPath = "/xyz/openbmc_project/inventory/system/chassis";
  const std::string childPath1 = "/xyz/openbmc_project/inventory/system/cpu0";
  const std::string childPath2 = "/xyz/openbmc_project/inventory/system/dimm4";
  health->selfPath = selfPath;
  health->inventory = {childPath1, childPath2};
  health->isManagersHealth = false;

  // 2. Build the 'statuses' map to trigger different logic paths.
  //    The types are vector<pair<...>>, so we use emplace_back.
  const std::string criticalAssocPath =
      "/xyz/openbmc_project/associations/cpu0_thermals/status/critical";
  const std::string selfWarningPath = selfPath + "/status/warning";
  const std::string skippedAssocPath =
      "/xyz/openbmc_project/associations/unrelated/status/critical";
  const std::string malformedAssocPath =
      "/xyz/openbmc_project/associations/malformed/status/critical";

  // Case A: A critical status on a path associated with a child inventory
  // item.
  DBusPropertiesMap criticalAssocProperties;
  criticalAssocProperties.emplace_back(
      "endpoints", DbusVariantType(std::vector<std::string>{childPath1}));
  DBusInteracesMap criticalAssocInterfaces;
  criticalAssocInterfaces.emplace_back("xyz.openbmc_project.Association",
                                       criticalAssocProperties);

  // Case B: A warning status directly on the 'self' path.
  DBusInteracesMap selfWarningInterfaces;  // Empty is sufficient

  // Case C: An association pointing to a non-child item.
  DBusPropertiesMap skippedAssocProperties;
  skippedAssocProperties.emplace_back(
      "endpoints", DbusVariantType(std::vector<std::string>{
                       "/xyz/openbmc_project/inventory/system/fan1"}));
  DBusInteracesMap skippedAssocInterfaces;
  skippedAssocInterfaces.emplace_back("xyz.openbmc_project.Association",
                                      skippedAssocProperties);

  // Case D: An association with a malformed 'endpoints' property.
  DBusPropertiesMap malformedAssocProperties;
  malformedAssocProperties.emplace_back(
      "endpoints", DbusVariantType(std::string("this is not a vector")));
  DBusInteracesMap malformedAssocInterfaces;
  malformedAssocInterfaces.emplace_back("xyz.openbmc_project.Association",
                                        malformedAssocProperties);

  // Construct the final ManagedObjectType vector
  health->statuses.emplace_back(
      sdbusplus::message::object_path(criticalAssocPath),
      criticalAssocInterfaces);
  health->statuses.emplace_back(
      sdbusplus::message::object_path(selfWarningPath), selfWarningInterfaces);
  health->statuses.emplace_back(
      sdbusplus::message::object_path(skippedAssocPath),
      skippedAssocInterfaces);
  health->statuses.emplace_back(
      sdbusplus::message::object_path(malformedAssocPath),
      malformedAssocInterfaces);

  // 3. Trigger the destructor where the health calculation logic resides.
  health.reset();

  // 4. Verify the final calculated health status.
  nlohmann::json& json = share_async_resp_->res.jsonValue;

  // The main 'Health' is "Warning" because of Case B (direct self path).
  EXPECT_EQ(json["Status"]["Health"], "Warning");

  // The 'HealthRollup' is "Critical" because of Case A, which has higher
  // severity.
  EXPECT_EQ(json["Status"]["HealthRollup"], "Critical");

  EXPECT_EQ(share_async_resp_->res.result(), boost::beast::http::status::ok);
}

TEST_F(SnapshotFixture, ProcessHealthStatusChange) {
  // 1. Setup
  HealthStatusCache& cache = HealthStatusCache::getInstance();
  cache.clear();

  // Define D-Bus paths and properties for a mock health criteria
  const std::string criteriaPath =
      "/xyz/openbmc_project/inventory/system/board/TestBoard/TestCriteria";
  sdbusplus::message::object_path criteriaPathObj(criteriaPath);

  const DBusPropertiesMap configProperties{
      {"Name", DbusVariantType("TestCriteria")},
      {"Severity", DbusVariantType("Warning")},
      {"FailureMessageId", DbusVariantType("Test.Failure.Message")},
      {"OkMessageId", DbusVariantType("Test.OK.Message")},
      {"MessageArgs",
       DbusVariantType(std::vector<std::string>{"Power", "Fault"})},
      {"Resolution", DbusVariantType("Replace the unit.")},
      {"RelatedEntityName", DbusVariantType("TestBoard")},
      {"RelatedEntityType", DbusVariantType("Board")}};

  ASSERT_TRUE(
      dynamic_cast<managedStore::MockSerializedManagedObjectStore*>(
          managedStore::GetManagedObjectStore())
          ->upsertMockObjectIntoManagedStore(
              KeyType(ManagedType::kManagedPropertyMap,
                      "xyz.openbmc_project.EntityManager", criteriaPathObj,
                      "xyz.openbmc_project.Configuration.HealthMonitor"),
              CreateValueType(configProperties))
          .ok());

  const DBusPropertiesMap initialStatusProperties{
      {"healthy", DbusVariantType(true)},
      {"toggle_count", DbusVariantType(uint64_t{0})}};
  sdbusplus::message::object_path statusPath(
      "/xyz/openbmc_project/HealthMonitor/TestCriteria");
  ASSERT_TRUE(dynamic_cast<managedStore::MockSerializedManagedObjectStore*>(
                  managedStore::GetManagedObjectStore())
                  ->upsertMockObjectIntoManagedStore(
                      KeyType(ManagedType::kManagedPropertyMap,
                              "xyz.openbmc_project.HealthMonitor", statusPath,
                              "xyz.openbmc_project.HealthMonitor.GetStatus"),
                      CreateValueType(initialStatusProperties))
                  .ok());

  // Populate the cache by calling the method that reads from mocked D-Bus
  cache.getHealthAttributes(criteriaPath);
  RunIoUntilDone();

  // 2. First call: Simulates a health change from Healthy to Unhealthy
  cache.processHealthStatusChange(criteriaPath);

  // 3. Verification 1: Check the generated log entry
  nlohmann::json logEntryArray;
  cache.fillLogEntries(logEntryArray, "system");

  ASSERT_EQ(logEntryArray.size(), 1);
  const nlohmann::json& log1 = logEntryArray[0];

  EXPECT_EQ(log1["MessageId"], "Test.Failure.Message");
  EXPECT_EQ(log1["Severity"], "Warning");
  EXPECT_EQ(log1["Resolved"], false);
  // toggleCount becomes 1, so ErrorCount is (1+1)/2 = 1
  EXPECT_EQ(log1["ErrorCount"], 1);

  // 4. Second call: Simulates a health change from Unhealthy to Healthy
  cache.processHealthStatusChange(criteriaPath);

  // 5. Verification 2: Check the new (resolved) log entry
  cache.fillLogEntries(logEntryArray, "system");

  ASSERT_EQ(logEntryArray.size(), 2);
  const nlohmann::json& log2 = logEntryArray[1];

  EXPECT_EQ(log2["MessageId"], "Test.OK.Message");
  EXPECT_EQ(log2["Severity"], "OK");
  EXPECT_EQ(log2["Resolved"], true);
  EXPECT_EQ(log2["ResolvedEntryId"], "0");
  // ErrorCount should not be present in a resolution log entry
  EXPECT_FALSE(log2.contains("ErrorCount"));
}

TEST_F(SnapshotFixture, HealthPopulateCorrectlyHandlesAllStatusPathTypes) {
  // This test covers the complex branching logic in the HealthPopulate
  // destructor by checking the precedence of different status path types.
  // The expected outcome is that a 'self' warning sets the main Health,
  // but a non-global, non-self critical status sets the final Rollup.
  auto health = std::make_shared<HealthPopulate>(share_async_resp_);

  // 1. Setup paths to simulate different inventory types.
  health->globalInventoryPath = "/global/inventory";
  health->selfPath = "/self/path";
  health->isManagersHealth = false;
  health->inventory = {};  // Keep inventory empty to isolate path logic.

  // 2. Define various status paths to trigger all logic branches.
  // This path should set rollup to "Warning" initially.
  const std::string nonGlobalWarningPath = "/some/other/path/warning";
  // This path should set health to "Warning" because isSelf is true.
  const std::string selfWarningPath = "/self/path/status/warning";
  // This path should upgrade rollup to "Critical". Health remains "Warning".
  const std::string nonGlobalCriticalPath = "/another/unrelated/path/critical";
  // This path would set health to "Warning", but the critical rollup above
  // should prevent the rollup from being downgraded.
  const std::string globalWarningPath = "/global/inventory/item/warning";

  // 3. Populate the statuses map. Order matters for testing precedence.
  health->statuses.emplace_back(
      sdbusplus::message::object_path(nonGlobalWarningPath),
      DBusInteracesMap{});
  health->statuses.emplace_back(
      sdbusplus::message::object_path(selfWarningPath), DBusInteracesMap{});
  health->statuses.emplace_back(
      sdbusplus::message::object_path(nonGlobalCriticalPath),
      DBusInteracesMap{});
  health->statuses.emplace_back(
      sdbusplus::message::object_path(globalWarningPath), DBusInteracesMap{});

  // 4. Trigger the destructor to run the health calculation.
  health.reset();

  // 5. Verify the final computed health status.
  nlohmann::json& json = share_async_resp_->res.jsonValue;

  // Health is "Warning" due to the selfWarningPath.
  EXPECT_EQ(json["Status"]["Health"], "Warning");
  // HealthRollup is "Critical" due to the nonGlobalCriticalPath.
  EXPECT_EQ(json["Status"]["HealthRollup"], "Critical");
  EXPECT_EQ(share_async_resp_->res.result(), boost::beast::http::status::ok);
}

TEST_F(SnapshotFixture, HealthPopulateReturnsEarlyOnCriticalPaths) {
  // This test verifies that the health calculation loop terminates early
  // when a critical status is encountered, as specified by the 'return'
  // statements in the logic.

  // Scenario 1: Global Critical Path
  {
    auto health = std::make_shared<HealthPopulate>(share_async_resp_);
    health->globalInventoryPath = "/global/inventory";

    // The first path is global and critical, which should cause an
    // immediate return. The second warning path should never be processed.
    health->statuses.emplace_back(
        sdbusplus::message::object_path("/global/inventory/item/critical"),
        DBusInteracesMap{});
    health->statuses.emplace_back(
        sdbusplus::message::object_path("/some/other/path/warning"),
        DBusInteracesMap{});

    health.reset();  // Trigger destructor

    nlohmann::json& json = share_async_resp_->res.jsonValue;
    EXPECT_EQ(json["Status"]["Health"], "Critical");
    EXPECT_EQ(json["Status"]["HealthRollup"], "Critical");
  }

  // Reset response for the next scenario
  SetUp();

  // Scenario 2: Self Critical Path
  {
    auto health = std::make_shared<HealthPopulate>(share_async_resp_);
    health->selfPath = "/self/path";

    // The first path is a 'self' critical path, which should cause an
    // immediate return. The following warning path should be ignored.
    health->statuses.emplace_back(
        sdbusplus::message::object_path("/self/path/status/critical"),
        DBusInteracesMap{});
    health->statuses.emplace_back(
        sdbusplus::message::object_path("/self/path/status/warning"),
        DBusInteracesMap{});

    health.reset();  // Trigger destructor

    nlohmann::json& json = share_async_resp_->res.jsonValue;
    EXPECT_EQ(json["Status"]["Health"], "Critical");
    EXPECT_EQ(json["Status"]["HealthRollup"], "Critical");
  }
}

}  // namespace
}  // namespace redfish
