#pragma once

#include <cstdint>
#include <map>
#include <memory>

#include "../../libs/include/pnet_api.h"

#include "profinet_serv_data.hpp"
#include "profinet_submodule.hpp"

class ProfinetSubslot
{
public:
   //ProfinetSubslot(uint16_t subslot_nbr) : m_subslot_nbr(subslot_nbr) {};
   
   ProfinetSubslot(uint16_t subslot_nbr, uint16_t slot_nbr, uint32_t module_id);

   bool plugSubmodule(ProfinetServiceData& pnet_data, std::shared_ptr<ProfinetSubmodule>& submodule_ptr);

   bool pullSubmodule(ProfinetServiceData& pnet_data);

   void setSlotNumber(uint16_t slot_nbr) { m_slot_nbr = slot_nbr; };
   
   void setModuleId(uint16_t module_id) { m_module_id = module_id; };

   std::shared_ptr<ProfinetSubmodule> getSubmodulePtr() { return m_submodule_ptr; };

public:
   /// Номер подслота
   const uint16_t m_subslot_nbr; 

private:
   /// Номер слота куда входит данный подслот
   uint16_t m_slot_nbr;

   /// Идентификатор модуля куда входит подключаемый подмодуль
   uint32_t m_module_id;

   /// Подмодуль вставленный в этот подслот
   std::shared_ptr<ProfinetSubmodule> m_submodule_ptr;
};