#include "ledlayout.hpp"
#include "manager.hpp"

#include <sdbusplus/bus.hpp>
#include <xyz/openbmc_project/Led/Physical/server.hpp>

#include <set>

#include <gtest/gtest.h>

using namespace phosphor::led;
class LedTest : public ::testing::Test
{
  public:
    sdbusplus::bus_t bus;
    LedTest() : bus(sdbusplus::bus::new_default())
    {
        // Nothing here
    }
    ~LedTest() override = default;
};

static void assertMap(std::map<LedName, Layout::LedAction> map,
                      std::map<LedName, Layout::Action> expect)
{
    EXPECT_EQ(map.size(), expect.size());
    for (auto& [key, expect_value] : expect)
    {
        ASSERT_TRUE(map.contains(key));
        EXPECT_EQ(expect_value, map[key].action);
    }
}

static const phosphor::led::GroupMap groups1 = {
    {"/xyz/openbmc_project/ledmanager/groups/groupA",
     {0,
      {
          {"led1", Layout::Action::On, 0, 0, std::nullopt},
          {"led2", Layout::Action::On, 0, 0, std::nullopt},
      }}},
    {"/xyz/openbmc_project/ledmanager/groups/groupB",
     {0,
      {
          {"led3", Layout::Action::On, 0, 0, std::nullopt},
          {"led4", Layout::Action::On, 0, 0, std::nullopt},
      }}},
};

/** @brief Assert one group*/
TEST_F(LedTest, assertOneGroup)
{
    Manager manager(bus, groups1);

    std::set<const Layout::GroupLayout*> assertedGroups;

    Layout::GroupLayout mygroup =
        groups1.at("/xyz/openbmc_project/ledmanager/groups/groupA");

    assertedGroups.insert(&mygroup);

    std::map<LedName, Layout::LedAction> map =
        phosphor::led::Manager::getNewMap(assertedGroups);

    assertMap(map, {
                       {"led1", Layout::Action::On},
                       {"led2", Layout::Action::On},
                   });
}

static const phosphor::led::GroupMap groups2 = {
    {"/xyz/openbmc_project/ledmanager/groups/groupA",
     {0,
      {
          {"led1", Layout::Action::On, 0, 0, std::nullopt},
          {"led2", Layout::Action::On, 0, 0, std::nullopt},
      }}},
    {"/xyz/openbmc_project/ledmanager/groups/groupB",
     {2,
      {
          {"led2", Layout::Action::Off, 0, 0, std::nullopt},
          {"led3", Layout::Action::On, 0, 0, std::nullopt},
      }}},
    {"/xyz/openbmc_project/ledmanager/groups/groupC",
     {1,
      {
          {"led3", Layout::Action::Blink, 0, 0, std::nullopt},
          {"led4", Layout::Action::Blink, 0, 0, std::nullopt},
      }}},
};

/** @brief Assert multiple groups which overwrite each other*/
TEST_F(LedTest, assertMultipleGroups)
{
    Manager manager(bus, groups2);

    std::set<const Layout::GroupLayout*> assertedGroups;

    Layout::GroupLayout groupA =
        groups2.at("/xyz/openbmc_project/ledmanager/groups/groupA");
    Layout::GroupLayout groupB =
        groups2.at("/xyz/openbmc_project/ledmanager/groups/groupB");
    Layout::GroupLayout groupC =
        groups2.at("/xyz/openbmc_project/ledmanager/groups/groupC");

    assertedGroups.insert(&groupA);
    assertedGroups.insert(&groupB);
    assertedGroups.insert(&groupC);

    std::map<LedName, Layout::LedAction> map =
        phosphor::led::Manager::getNewMap(assertedGroups);

    assertMap(map, {
                       {"led1", Layout::Action::On},
                       {"led2", Layout::Action::Off},
                       {"led3", Layout::Action::On},
                       {"led4", Layout::Action::Blink},
                   });
}

TEST_F(LedTest, test_OCP_Panel_Indicator_6_1_System_Power_Status)
{
    const int dutyon = 50; // Spec says 50% duty cycle
    const int period = 1;  // Spec says 1Hz

    // Example from OCP Panel Indicator Specification rev 1.0, Section 6.1
    // "System Power Control / Status"
    // The group priorities here are chosen arbitrarily, assuming that locating
    // the hw has highest priority
    const std::string groupOffServiceAction =
        "/xyz/openbmc_project/ledmanager/groups/SysOffServiceAction";
    const std::string groupSysOnOk =
        "/xyz/openbmc_project/ledmanager/groups/SysOnOK";
    const std::string groupSysOffFault =
        "/xyz/openbmc_project/ledmanager/groups/SysOffFault";
    const std::string groupSysOnLocate =
        "/xyz/openbmc_project/ledmanager/groups/SysOnLocate";
    const std::string groupSysOffLocate =
        "/xyz/openbmc_project/ledmanager/groups/SysOffLocate";
    const std::string groupSysOnFault =
        "/xyz/openbmc_project/ledmanager/groups/SysOnFault";

    const std::string pwr = "pwr";
    const std::string fault = "fault";

    static const phosphor::led::GroupMap groups_ocp_6_1_power_control = {
        {groupOffServiceAction,
         {2,
          {
              {pwr, Layout::Action::Off, 0, 0, std::nullopt},
              {fault, Layout::Action::Off, 0, 0, std::nullopt},
          }}},
        {groupSysOnOk,
         {3,
          {
              {pwr, Layout::Action::On, 0, 0, std::nullopt},
              {fault, Layout::Action::Off, 0, 0, std::nullopt},
          }}},
        {groupSysOffFault,
         {38,
          {
              {pwr, Layout::Action::Off, 0, 0, std::nullopt},
              {fault, Layout::Action::On, 0, 0, std::nullopt},
          }}},
        {groupSysOnLocate,
         {99,
          {
              {pwr, Layout::Action::On, 0, 0, std::nullopt},
              {fault, Layout::Action::Blink, dutyon, period, std::nullopt},
          }}},
        {groupSysOffLocate,
         {98,
          {
              {pwr, Layout::Action::Off, 0, 0, std::nullopt},
              {fault, Layout::Action::Blink, dutyon, period, std::nullopt},
          }}},
        {groupSysOnFault,
         {39,
          {
              {pwr, Layout::Action::On, 0, 0, std::nullopt},
              {fault, Layout::Action::On, 0, 0, std::nullopt},
          }}},
    };

    const phosphor::led::GroupMap* groups = &groups_ocp_6_1_power_control;

    Manager manager(bus, *groups);

    std::set<const Layout::GroupLayout*> assertedGroups;

    // Off Service Action
    assertedGroups.insert(&groups->at(groupOffServiceAction));

    assertMap(phosphor::led::Manager::getNewMap(assertedGroups),
              {
                  {pwr, Layout::Action::Off},
                  {fault, Layout::Action::Off},
              });

    // On Ok
    assertedGroups.insert(&groups->at(groupSysOnOk));
    assertMap(phosphor::led::Manager::getNewMap(assertedGroups),
              {
                  {pwr, Layout::Action::On},
                  {fault, Layout::Action::Off},
              });

    // Off Fault
    assertedGroups.insert(&groups->at(groupSysOffFault));
    assertMap(phosphor::led::Manager::getNewMap(assertedGroups),
              {
                  {pwr, Layout::Action::Off},
                  {fault, Layout::Action::On},
              });

    // Off Fault
    assertedGroups.insert(&groups->at(groupSysOffFault));
    assertMap(phosphor::led::Manager::getNewMap(assertedGroups),
              {
                  {pwr, Layout::Action::Off},
                  {fault, Layout::Action::On},
              });

    // On Fault
    assertedGroups.insert(&groups->at(groupSysOnFault));
    assertMap(phosphor::led::Manager::getNewMap(assertedGroups),
              {
                  {pwr, Layout::Action::On},
                  {fault, Layout::Action::On},
              });

    // Off Locate
    assertedGroups.insert(&groups->at(groupSysOffLocate));
    assertMap(phosphor::led::Manager::getNewMap(assertedGroups),
              {
                  {pwr, Layout::Action::Off},
                  {fault, Layout::Action::Blink},
              });

    // On Locate
    assertedGroups.insert(&groups->at(groupSysOnLocate));
    assertMap(phosphor::led::Manager::getNewMap(assertedGroups),
              {
                  {pwr, Layout::Action::On},
                  {fault, Layout::Action::Blink},
              });
}

TEST_F(LedTest, test_OCP_Panel_Indicator_6_5_BBU_status)
{
    // Example from OCP Panel Indicator Specification rev 1.0, Section 6.5
    // "BBU Status"
    // The group priorities here are chosen arbitrarily, assuming that locating
    // the hw has highest priority
    const std::string gBBUSleep =
        "/xyz/openbmc_project/ledmanager/groups/BBUSleep";
    const std::string gBBUOn = "/xyz/openbmc_project/ledmanager/groups/BBUOn";
    const std::string gBBUFault =
        "/xyz/openbmc_project/ledmanager/groups/BBUFault";
    const std::string gBBUUnderVolt =
        "/xyz/openbmc_project/ledmanager/groups/BBUUnderVolt";
    const std::string gBBUEOL = "/xyz/openbmc_project/ledmanager/groups/BBUEOL";
    const std::string gBBUOffLocate =
        "/xyz/openbmc_project/ledmanager/groups/BBUOffLocate";
    const std::string gBBUOnLocate =
        "/xyz/openbmc_project/ledmanager/groups/BBUOnLocate";

    const std::string bbu_ok = "bbu_ok";
    const std::string bbu_fault = "bbu_fault";
    const std::string bbu_lowv = "bbu_lowv";
    const std::string bbu_eol = "bbu_eol";

    static const phosphor::led::GroupMap groups_ocp_6_5_bbu_status = {
        {gBBUSleep,
         {9,
          {
              {bbu_ok, Layout::Action::Off, 0, 0, std::nullopt},
              {bbu_fault, Layout::Action::Off, 0, 0, std::nullopt},
              {bbu_lowv, Layout::Action::Off, 0, 0, std::nullopt},
              {bbu_eol, Layout::Action::Off, 0, 0, std::nullopt},
          }}},
        {gBBUOn,
         {10,
          {
              {bbu_ok, Layout::Action::On, 0, 0, std::nullopt},
              {bbu_fault, Layout::Action::Off, 0, 0, std::nullopt},
              {bbu_lowv, Layout::Action::Off, 0, 0, std::nullopt},
              {bbu_eol, Layout::Action::Off, 0, 0, std::nullopt},
          }}},
        {gBBUFault,
         {38,
          {
              {bbu_ok, Layout::Action::Off, 0, 0, std::nullopt},
              {bbu_fault, Layout::Action::On, 0, 0, std::nullopt},
              {bbu_lowv, Layout::Action::Off, 0, 0, std::nullopt},
              {bbu_eol, Layout::Action::Off, 0, 0, std::nullopt},
          }}},
        {gBBUUnderVolt,
         {39,
          {
              {bbu_ok, Layout::Action::Off, 0, 0, std::nullopt},
              {bbu_fault, Layout::Action::On, 0, 0, std::nullopt},
              {bbu_lowv, Layout::Action::On, 0, 0, std::nullopt},
              {bbu_eol, Layout::Action::Off, 0, 0, std::nullopt},
          }}},
        {gBBUEOL,
         {40,
          {
              {bbu_ok, Layout::Action::Off, 0, 0, std::nullopt},
              {bbu_fault, Layout::Action::On, 0, 0, std::nullopt},
              {bbu_lowv, Layout::Action::Off, 0, 0, std::nullopt},
              {bbu_eol, Layout::Action::On, 0, 0, std::nullopt},
          }}},
        {gBBUOffLocate,
         {98,
          {
              {bbu_ok, Layout::Action::Off, 0, 0, std::nullopt},
              {bbu_fault, Layout::Action::Blink, 0, 0, std::nullopt},
              {bbu_lowv, Layout::Action::Off, 0, 0, std::nullopt},
              {bbu_eol, Layout::Action::Off, 0, 0, std::nullopt},
          }}},
        {gBBUOnLocate,
         {99,
          {
              {bbu_ok, Layout::Action::On, 0, 0, std::nullopt},
              {bbu_fault, Layout::Action::Blink, 0, 0, std::nullopt},
              {bbu_lowv, Layout::Action::Off, 0, 0, std::nullopt},
              {bbu_eol, Layout::Action::Off, 0, 0, std::nullopt},
          }}},
    };

    const phosphor::led::GroupMap* groups = &groups_ocp_6_5_bbu_status;

    Manager manager(bus, *groups);

    std::set<const Layout::GroupLayout*> assertedGroups;

    // Sleep
    assertedGroups.insert(&groups->at(gBBUSleep));
    assertMap(phosphor::led::Manager::getNewMap(assertedGroups),
              {
                  {bbu_ok, Layout::Action::Off},
                  {bbu_fault, Layout::Action::Off},
                  {bbu_lowv, Layout::Action::Off},
                  {bbu_eol, Layout::Action::Off},
              });

    // Fault
    assertedGroups.insert(&groups->at(gBBUFault));
    assertMap(phosphor::led::Manager::getNewMap(assertedGroups),
              {
                  {bbu_ok, Layout::Action::Off},
                  {bbu_fault, Layout::Action::On},
                  {bbu_lowv, Layout::Action::Off},
                  {bbu_eol, Layout::Action::Off},
              });

    // EOL
    assertedGroups.insert(&groups->at(gBBUEOL));
    assertMap(phosphor::led::Manager::getNewMap(assertedGroups),
              {
                  {bbu_ok, Layout::Action::Off},
                  {bbu_fault, Layout::Action::On},
                  {bbu_lowv, Layout::Action::Off},
                  {bbu_eol, Layout::Action::On},
              });

    // On + Locate
    assertedGroups.insert(&groups->at(gBBUOnLocate));
    assertMap(phosphor::led::Manager::getNewMap(assertedGroups),
              {
                  {bbu_ok, Layout::Action::On},
                  {bbu_fault, Layout::Action::Blink},
                  {bbu_lowv, Layout::Action::Off},
                  {bbu_eol, Layout::Action::Off},
              });
}
