/** \file
 *
 *  Contains the SimACommsRangeGazebo class declaration.
 *
 *  Copyright (c) 2007,2008,2009 MBARI
 *  MBARI Proprietary Information.  All Rights Reserved
 */

#ifndef SIMACOMMSRANGEGAZEBO_H_
#define SIMACOMMSRANGEGAZEBO_H_

#include "SimACommsRangeHandler.h"
#include "SimACommsMessage.h"
#include "utils/Timestamp.h"

#include "lrauv_gazebo_plugins/lrauv_acoustic_message.pb.h"
#include "lrauv_gazebo_plugins/lrauv_range_bearing_request.pb.h"
#include "lrauv_gazebo_plugins/lrauv_range_bearing_response.pb.h"
#include <gz/transport/Node.hh>


class SimACommsRangeGazebo
{
public:
    /// Constructor
    SimACommsRangeGazebo();

    /// Destructor
    ~SimACommsRangeGazebo();

    /// Initialize the handler with vehicle name topics
    /// \param[in] vehicleName string containing vehicle name
    void Initialize( const Str& vehicleName );

    /// Publish range request to remote contact
    /// \param[in] rangeMessage simulated range message class containing address and message ID info
    bool PublishRangeMessage( const SimACommsRangeMessage& rangeMessage );

private:

    /// Uninitialize the handler
    void uninitialize( void );

    /// Callback function for Gazebo LRAUVRangeBearingResponse messages
    /// \param[in] msg LRAUVRangeBearingResponse message
    void rangeResponseCallback( const lrauv_gazebo_plugins::msgs::LRAUVRangeBearingResponse& msg );

    /// Holds the Gazebo transport node
    gz::transport::Node node_;

    /// Publisher Gazebo LRAUVRangeBearingRequest messages
    gz::transport::Node::Publisher rangePub_;

    /// Holds the range pub topic name
    Str topic_;

    /// Holds the current range message destination
    // TODO(byraanan) add source info to LRAUVRangeBearingResponse
    int rangeMsgDestination_;

    /// Indicates class initialization status
    bool initialized_;

};

#endif /*SIMACOMMSRANGEGAZEBO_H_*/
