#include "CollisionExporter.h"
#include "Globals.h"
#include "RoomExporter.h"
#include "TextureExporter.h"

enum class ExporterFileMode
{
	ModeExample1 = (int)ZFileMode::Custom + 1,
	ModeExample2 = (int)ZFileMode::Custom + 2,
	ModeExample3 = (int)ZFileMode::Custom + 3,
};

static void ExporterParseFileMode(const std::string& buildMode, ZFileMode& fileMode)
{
	if (buildMode == "me1")
		fileMode = (ZFileMode)ExporterFileMode::ModeExample1;
	else if (buildMode == "me2")
		fileMode = (ZFileMode)ExporterFileMode::ModeExample2;
	else if (buildMode == "me3")
		fileMode = (ZFileMode)ExporterFileMode::ModeExample3;
}

static void ExporterParseArgs([[maybe_unused]] int argc, char* argv[], int& i)
{
	std::string arg = argv[i];

	if (arg == "--do-x")
	{
	}
	else if (arg == "--do-y")
	{
	}
}

static bool ExporterProcessFileMode(ZFileMode fileMode)
{
	// Do whatever work is associated with these custom file modes...
	// Return true to indicate one of our own file modes is being processed
	if (fileMode == (ZFileMode)ExporterFileMode::ModeExample1)
		return true;
	else if (fileMode == (ZFileMode)ExporterFileMode::ModeExample2)
		return true;
	else if (fileMode == (ZFileMode)ExporterFileMode::ModeExample3)
		return true;

	return false;
}

static void ExporterFileBegin(ZFile* file)
{
	printf("ExporterFileBegin() called on ZFile %s.\n", file->GetName().c_str());
}

static void ExporterFileEnd(ZFile* file)
{
	printf("ExporterFileEnd() called on ZFile %s.\n", file->GetName().c_str());
}

static void ImportExporters()
{
	// In this example we set up a new exporter called "EXAMPLE".
	// By running ZAPD with the argument -se EXAMPLE, we tell it that we want to use this exporter
	// for our resources.
	ExporterSet* exporterSet = new ExporterSet();
	exporterSet->processFileModeFunc = ExporterProcessFileMode;
	exporterSet->parseFileModeFunc = ExporterParseFileMode;
	exporterSet->parseArgsFunc = ExporterParseArgs;
	exporterSet->beginFileFunc = ExporterFileBegin;
	exporterSet->endFileFunc = ExporterFileEnd;
	exporterSet->exporters[ZResourceType::Texture] = new ExporterExample_Texture();
	exporterSet->exporters[ZResourceType::Room] = new ExporterExample_Room();
	exporterSet->exporters[ZResourceType::CollisionHeader] = new ExporterExample_Collision();

	Globals::AddExporter("EXAMPLE", exporterSet);
}

// When ZAPD starts up, it will automatically call the below function, which in turn sets up our
// exporters.
REGISTER_EXPORTER(ImportExporters);