#pragma once

#include "explode.h"
#include "segment.h"
#include "slot.h"

//##########################################################################
//##########################    AudioEntity    #############################
//##########################################################################

class AudioEntity__MakeMessage;

class AudioEntity : public Explosion
{
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Public types
//
public:
	typedef AudioEntity__MakeMessage MakeMessage;

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Construction and Destruction
//
public:
	AudioEntity(MakeMessage *creation_message, SharedData &shared_data = DefaultData);
	~AudioEntity();

	static AudioEntity* Make(MakeMessage *creation_message);

	Logical TestInstance() const;

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Model Support
//
public:
	typedef void (AudioEntity::*Performance)(Scalar time_slice);

	void SetPerformance(Performance performance)
	{
		Check(this);
		activePerformance = (Simulation::Performance)performance;
	}

	void AudioEntitySimulation(Scalar time_slice);

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Shared Data support
//
public:
	static Derivation *GetClassDerivations();
	static SharedData DefaultData;

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Private Data
//
private:
	SlotOf<Entity*> parentEntitySocket;
	EntitySegment *parentEntitySegment;
};

//##########################################################################
//####################    AudioEntity__MakeMessage    ######################
//##########################################################################

class AudioEntity__MakeMessage : public Explosion::MakeMessage
{
public:
	AudioEntity__MakeMessage(ResourceDescription::ResourceID resource_ID, Entity *parent_entity, EntitySegment *parent_entity_segment);

	EntityID parentEntityID;
	EntitySegment *parentEntitySegment;
};
