#pragma once

#include "notation.h"
#include "resource.h"
#include "controls.h"
#include "gaugalrm.h"
#include "audtools.h"
#include "entity.h"

struct ModelData
{
	char pageName[100];
	char modelName[100];
	ResourceDescription::ResourceID videoResourceID;
	ResourceDescription::ResourceID skeletonResourceID;
	ResourceDescription::ResourceID audioResourceID;
	ResourceDescription::ResourceID collisionID;
	ResourceDescription::ResourceID gameResourceID;
	ResourceDescription::ResourceID subsystemResourceID;
	ResourceDescription::ResourceID controlsMappingsResourceID;
	ResourceDescription::ResourceID damageZoneResourceID;
	ResourceDescription::ResourceID gaugeImageResourceID;
	ResourceDescription::ResourceID gaugeAlarmResourceID;
	ResourceDescription::ResourceID gaugeMissionReviewResourceID;
	ResourceDescription::ResourceID explosionTableResourceID;
	RegisteredClass::ClassID classID;

	ResourceDescription::ResourceID resourceID;
};

struct
	InstanceData
{
	char pageName[100];
	char modelName[100];

	ResourceDescription::ResourceID resourceID;
};

struct
	InstanceResource
{
	Origin origin;
	ResourceDescription::ResourceID resourceID;
};

//##########################################################################
//#########################    PlatformTool    #############################
//##########################################################################

class PlatformTool
{
public:
	PlatformTool()
		{
     	gaugeAlarmManager = NULL;
		}


	virtual ResourceDescription::ResourceID
		CreateModelVideoStreamResource(
			ResourceFile *resource_file,
			const char *model_name,
			NotationFile *model_file,
			const ResourceDirectories *directories
		)=0;

	virtual ResourceDescription::ResourceID
		CreateModelAudioStreamResource(
			ResourceFile *resource_file,
			const char *model_name,
			NotationFile *model_file,
			const ResourceDirectories *directories
		)=0;

	virtual ResourceDescription::ResourceID
		CreateModelGaugeImageStreamResource(
			ResourceFile *resource_file,
			const char *model_name,
			NotationFile *model_file,
			const ResourceDirectories *directories
		)=0;

	virtual ResourceDescription::ResourceID
		CreateModelGaugeMissionReviewStreamResource(
			ResourceFile *resource_file,
			const char *model_name,
			NotationFile *model_file,
			const ResourceDirectories *directories
		)=0;

	virtual ResourceDescription::ResourceID
		CreateStaticAudioStreamResource(
			ResourceFile *resource_file
		)=0;

	typedef Logical
		(*FindNameFunction)(
			const char *control_name,
			ControlsMapping *mapping
		);
	virtual FindNameFunction
		GetControlMappingFunction()=0;

	virtual Logical
		ConvertStringToModeMask(
			const char *string,
			ModeMask *returned_value_ptr
		);
	virtual Logical
		ConvertStringToTechStatus(
			const char *string,
			int *returned_value_ptr
		);

	GaugeAlarmManager
		*gaugeAlarmManager;		// should be set at the topmost level
};

//##########################################################################
//########################    ApplicationTool    ###########################
//##########################################################################

class ApplicationTool
{
protected:
	PlatformTool*
		platformTool;

	virtual Logical
		CreateMakeMessage(
			const char* class_name,
			Entity::MakeMessage *creation_message,
			NotationFile *model_file,
			const ResourceDirectories *directories
		);

	virtual void
		CreateModelResource(
			ModelData &model_resources,
			const char *model_class,
			ResourceFile *resource_file,
			const char *model_name,
			NotationFile *model_file,
			const ResourceDirectories *directories
		);

	virtual ResourceDescription::ResourceID
		CreateControlMappingStream(
			const char *model_class,
			const char *mapping_name,
			NotationFile *mapping_file,
			ResourceFile *resource_file,
			const char *model_name,
			NotationFile *model_file,
			const ResourceDirectories *directories,
			PlatformTool *current_tool
		)=0;

	virtual void
		ListResource(ResourceDescription *resource);

	Logical
		WriteMaps(
			char *map_name,
			NotationFile *notation_file,
			NotationFile *ops_file,
			StreamableResourceFile *file,
			const ResourceDirectories *resource_directories,
			int resource_id = -1
		);

	Logical
		WriteModels(
			NotationFile *notation_file,
			NotationFile *ops_file,
			StreamableResourceFile *file,
			const char *model_name,
			const ResourceDirectories *resource_directories,
			int resource_id = -1
		);

	void
		WriteOpsFile(
			NotationFile *ops_file,
			StreamableResourceFile *file,
			const ResourceDirectories *resource_directories
		);

	Logical
		WriteAnimationCycle(
			NotationFile *animation_file,
			StreamableResourceFile *file,
			const char *animation_name
		);

	Logical
		WriteAnimationTransition(
			NotationFile *animation_file,
			StreamableResourceFile *file,
			const char *animation_name
		);

public:
	Logical
		labOnly,
		verboseMode;

	ApplicationTool(PlatformTool *platform)
		{platformTool = platform;}

	int
		BuildResources(
			int argc,
			char **argv,
			AudioCreateSymbols &create_symbols,
			Byte minor_version
		);
	int
		ListResources(
			int argc,
			char **argv
		);
};
