#ifndef _INTEROCEPTOR_H
#define _INTEROCEPTOR_H

#include <cstdint>
#include <sensors/sensor.h>

namespace smo {
namespace sensors {

class Interoceptor
: public Sensor
{
public:
    Interoceptor(uint32_t _id, uint32_t _value = 0)
    : id(_id), value(_value)
    {}
    ~Interoceptor() = default;

public:
    uint32_t id;
    uint64_t value;
};

class NeutrinTeroceptor
: public Interoceptor
{
public:
    NeutrinTeroceptor(uint32_t _id, uint32_t _value = 0)
    : Interoceptor(_id, _value)
    {}
};

class IntrinTeroceptor
: public Interoceptor
{
public:
    static constexpr uint32_t DEFAULT_INDICATION_THRESHOLD = 1;
    static constexpr uint32_t DEFAULT_ALERT_THRESHOLD = 5;
    static constexpr uint32_t DEFAULT_OVERLOAD_THRESHOLD = 9;

    IntrinTeroceptor(
        uint32_t _id,
        uint32_t _value = 0,
        uint32_t _indicationThreshold = DEFAULT_INDICATION_THRESHOLD,
        uint32_t _alertThreshold = DEFAULT_ALERT_THRESHOLD,
        uint32_t _overloadThreshold = DEFAULT_OVERLOAD_THRESHOLD)
    :   Interoceptor(_id, _value),
    indicationThreshold(_indicationThreshold),
    alertThreshold(_alertThreshold),
    overloadThreshold(_overloadThreshold)
    {}

    ~IntrinTeroceptor() = default;

public:
    uint32_t indicationThreshold;
    uint32_t alertThreshold;
    uint32_t overloadThreshold;
};

/**
 * Negtrin and Postrin interoceptors are specialized intrinsic interoceptors 
 * that, unlike neutral interoceptors, have activation thresholds for different 
 * response levels (indication, alert, and overload). These thresholds allow 
 * them to trigger graduated responses based on stimulus intensity.
 * 
 * While neutral interoceptors simply record a binary state or basic value, 
 * Negtrin and Postrin Interoceptors can model complex sensory responses with 
 * multiple activation levels, similar to biological pain/pleasure responses. 
 * Each threshold represents a different level of urgency or intensity in the 
 * sensory input.
 *
 * @see IntrinTeroceptor for the threshold values and implementation details
 ******************************************************************************/

class NegtrinTeroceptor
: public IntrinTeroceptor
{
public:
    NegtrinTeroceptor(
        uint32_t _id,
        uint32_t _value = 0,
        uint32_t _indicationThreshold = DEFAULT_INDICATION_THRESHOLD,
        uint32_t _alertThreshold = DEFAULT_ALERT_THRESHOLD,
        uint32_t _overloadThreshold = DEFAULT_OVERLOAD_THRESHOLD)
    :   IntrinTeroceptor(_id, _value,
            _indicationThreshold, _alertThreshold, _overloadThreshold)
    {}
};

class PostrinTeroceptor
: public IntrinTeroceptor
{
public:
    PostrinTeroceptor(
        uint32_t _id,
        uint32_t _value = 0,
        uint32_t _indicationThreshold = DEFAULT_INDICATION_THRESHOLD,
        uint32_t _alertThreshold = DEFAULT_ALERT_THRESHOLD,
        uint32_t _overloadThreshold = DEFAULT_OVERLOAD_THRESHOLD)
    :   IntrinTeroceptor(_id, _value,
            _indicationThreshold, _alertThreshold, _overloadThreshold)
    {}
};

} // namespace sensors
} // namespace smo

#endif // _INTEROCEPTOR_H
