#include "state_sensor.hpp"

#include <format>
#include <iostream>

namespace pldm
{
namespace platform_mc
{

StateSensor::StateSensor(const pldm_tid_t tid,
                         std::shared_ptr<pldm_state_sensor_pdr> pdr,
                         std::string& sensorName) :
    tid(tid), sensorId(pdr->sensor_id), sensorName(sensorName),
    compositeSensorCount(pdr->composite_sensor_count)
{}

void StateSensor::addStateSet(uint16_t stateSetId)
{
    compositeSensors.push_back(PldmStateSetReading{stateSetId, {0, 0, 0, 0}});
}

int StateSensor::getCompositeSensorCount() const
{
    return compositeSensors.size();
}

void StateSensor::setFunctionalStatus(bool functional)
{
    if (operationalStatusIntf)
    {
        operationalStatusIntf->functional(functional);
    }
}

void StateSensor::updateStateReading(uint8_t cnt,
                                     get_sensor_state_field fields[])
{
    if (cnt != getCompositeSensorCount())
    {
        std::cerr
            << std::format(
                   "Error : {} got invalid CompositeSensorCount, expect:{}, got: {}",
                   sensorName, unsigned(getCompositeSensorCount()),
                   unsigned(cnt))
            << std::endl;
        setFunctionalStatus(false);
        return;
    }

    std::vector<PldmStateReadingTuple> newReading;
    for (int i = 0; i < cnt; i++)
    {
        compositeSensors[i].reading = fields[i];
        newReading.push_back(PldmStateReadingTuple{
            compositeSensors[i].stateSetId, fields[i].sensor_op_state,
            fields[i].present_state, fields[i].previous_state,
            fields[i].event_state});
    }

    if (stateReadingIntf)
    {
        stateReadingIntf->values(newReading);
    }
    setFunctionalStatus(true);
}

void StateSensor::invalidateStateSensor()
{
    std::vector<PldmStateReadingTuple> newReading;
    get_sensor_state_field field{PLDM_SENSOR_STATUSUNKOWN, 0, 0, 0};

    for (PldmStateSetReading& reading : compositeSensors)
    {
        reading.reading = field;
        newReading.push_back(PldmStateReadingTuple{
            reading.stateSetId, field.sensor_op_state, field.present_state,
            field.previous_state, field.event_state});
    }

    if (stateReadingIntf)
    {
        stateReadingIntf->values(newReading);
    }
    setFunctionalStatus(false);
}

void StateSensor::createStateSensor(sdbusplus::bus::bus& bus)
{
    sensorPath = "/xyz/openbmc_project/sensors/PLDMState/" + sensorName;

    try
    {
        operationalStatusIntf = std::make_unique<OperationalStatusIntf>(
            bus, sensorPath.c_str(), OperationalStatusIntf::action::defer_emit);
        operationalStatusIntf->functional(false);

        stateReadingIntf =
            std::make_unique<StateReadingIntf>(bus, sensorPath.c_str());
    }
    catch (const std::exception& e)
    {
        std::cerr << "Failed to create StateSensor interfaces for "
                  << sensorName << ": " << e.what() << std::endl;
    }
}

} // namespace platform_mc
} // namespace pldm
