#pragma once


#include "SimCore/Identifier.hpp"
#include "SimCore/SimCore.hpp"
#include "google/protobuf/any.pb.h"
#include <SimCore/Position.hpp>
#include <WHISPER/Messages/Message.hpp>
#include <SimCore/Messages/Protos/Track.pb.h>

#include <Eigen/Core>


#include <cstddef>
#include <cstdint>
#include <memory>
#include <string>
#include <loguru.hpp>
#include <type_traits>

namespace SimCore {

   

    class Track 
    {             
        private:        
            /// ID of the object
            const SimCore::Identifier ID_;    

            const SimCore::TrackKind TrackKind_ = UNKNOWN_TRACK;
               
            const  WHISPER::SourceType SourceType_;

            const SimCore::ObjectSource ObjectSource_;

    

        public:

            /**
            * @brief constructor for building a track  which is also the trackmessage to send
            * @param WHISPER::SourceType sourcetype of the sending device
            * @param SimCore::Identifier object identifier
            *
            * @return 
            */
            Track( WHISPER::SourceType src,SimCore::Identifier id, SimCore::TrackKind trackkind,SimCore::ObjectSource ObjectSource = EXTERNAL);

           

            const SimCore::Identifier getIdentifier();

            const SimCore::TrackKind getTrackkind();

            const WHISPER::SourceType getSourceType();

            const SimCore::ObjectSource getObjectSource();



        protected:

            virtual WHISPER::Message buildMessage(SimCore::Identifier parentID) = 0;
            
            


    };
}