#pragma once

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

#include "../shared_data/shared_data_iface.hpp"


class ProfinetParameter
{
public:
    static std::shared_ptr<ProfinetParameter> Create(uint32_t Index, std::string Name, SharedDataIface * p_data)
    {
        if (p_data == nullptr)
        {
            return nullptr;
        }

        return std::shared_ptr<ProfinetParameter>(new ProfinetParameter(Index, Name, p_data));
    }

    ProfinetParameter(uint32_t Index, std::string Name, SharedDataIface * p_data);
    
    /**
     * @brief Защищенная запись данных параметра
     * 
     * @param data_ptr 
     * @return true 
     * @return false 
     */
    bool writeParameter(const uint8_t * data_ptr);
    
    /**
     * @brief Защищенное чтение данных параметра
     * 
     * @param data_ptr 
     * @return true 
     * @return false 
     */
    bool readParameter(uint8_t * const data_ptr);

    /**
     * @brief Стек pnet сам копирует данные параметра внутрь себя.
     * Для этого ему в колбэке нужно предоставить указатель на данные параметра и длину данных.
     * Подразумевается, что эта функция будет использоваться только внутри колбэка стека pnet.
     * см. profinet_cb_read.cpp
     * @return uint8_t* 
     */
    uint8_t * getReadBufPtr();
private:


public:                      
    const std::string          name;               /// Имя параметра
    const uint32_t             index;              /// Идентфикатор параметра
    const uint16_t             length;             /// длина параметра в байтах

private:
    std::shared_ptr<uint8_t[]> read_buf_; ///Буфер данных для передачи его в стек pnet для операции чтения
    SharedDataIface * const p_data_;          ///Указатель на данные параметра(в разделяемой области)
};