#ifndef UDP_COMMAND_DEMUXER_H
#define UDP_COMMAND_DEMUXER_H

#include <atomic>
#include <memory>
#include <boost/asio/deadline_timer.hpp>
#include <boost/asio/posix/stream_descriptor.hpp>
#include <componentThread.h>

namespace livoxProto1 {

// Forward declarations
class DeviceManager;

namespace comms {

/**
 * UdpCommandDemuxer - Routes UDP command datagrams to appropriate devices
 *
 * This class listens on the command port (65000) for incoming UDP datagrams
 * from Livox devices and routes them to the appropriate Device based on
 * the source IP address.
 */
class UdpCommandDemuxer
{
public:
	UdpCommandDemuxer(
		const std::shared_ptr<smo::ComponentThread>& componentThread,
		DeviceManager& deviceManager,
		uint16_t commandPort = 65000);

	~UdpCommandDemuxer();

	void start();
	void stop();
	bool isRunning() const { return isActive.load(); }

private:
	void setupSocket();
	void startAsyncReceive();
	void onDataReady(const boost::system::error_code& error);
	void onTimerTick(const boost::system::error_code& error);
	void processIncomingData();

	std::shared_ptr<smo::ComponentThread> componentThread;
	DeviceManager& deviceManager;
	uint16_t commandPort;

	// Socket and async objects
	std::unique_ptr<boost::asio::posix::stream_descriptor> socketDesc;
	boost::asio::deadline_timer timer;

	// State management
	std::atomic<bool> isActive{false};
	std::atomic<bool> shouldStop{false};

	// Receive buffer
	uint8_t receiveBuffer[1024];
	struct sockaddr_in senderAddr;
	socklen_t senderAddrLen;
	ssize_t bytesReceived;
};

} // namespace comms
} // namespace livoxProto1

#endif // UDP_COMMAND_DEMUXER_H
