#pragma once

#include "resource.h"
#include "schain.h"
#include "caminst.h"

//##########################################################################
//#####################    CameraInstanceManager     #######################
//##########################################################################

class CameraInstanceManager SIGNATURED
{
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//	local member data
//
protected:
	//
	//	cameraList is a circular Linked list
	// which holds cameraInstances
	//
	SChainOf<CameraInstance*> cameraList;
	//
	// CameraIterator holds the current position in the
	// camera list for the lifetime of the class
	// & == NULL if the list is empty
	//
	SChainIteratorOf<CameraInstance*> *cameraIterator;

	int FindUniqueCameraID();

	char cameraFilename[128];

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//	Public Member Manipulation Functions
//
public:
	//
	//	CameraList Manipulator Functions
	//
	void SetCamera(const Origin &new_origin, CameraInstance *camera_instance = NULL);

	CameraInstance* CreateCameraInstance(const Origin &new_origin);

	CameraInstance* AddCameraInstance(CameraInstance *camera_instance);

	CameraInstance* DeleteCameraInstance();

	void DeleteCameraList();

	//
	// Iterator Manipulator Functions (Circular Chain)
	//
	CameraInstance* IncrementIterator();

	CameraInstance* DecrementIterator();

	CameraInstance* AdvanceIterator(const CameraInstance &camera_instance);

	CameraInstance* GetCurrent() const
	{
		Check(this);
		return cameraIterator->GetCurrent();
	}

	CameraInstance* First()
	{
		Check(this);
		Check(cameraIterator->GetCurrent());
		cameraIterator->First();
		return GetCurrent();
	}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// CameraList Searching and Query Functions
//
public:
	CameraInstance* FindClosestCamera(const Point3D &point_3D);
	CameraInstance* FindClosestCameraShowing(const Point3D *points);

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Test Class Support
//
public:
	Logical TestInstance() const;

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//	Construction and Destruction Support
//
public:
	CameraInstanceManager();
	~CameraInstanceManager();

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//	Tool Support
//
protected:

	void InitializeCameraInstances();

public:
	void ReadNotationFile();
	void CreateStreamedCameraInstances(ResourceFile *res_file, const char   *map_name);

	void WriteNotationFile();
	static ResourceDescription::ResourceID CreateCameraInstancesStream(ResourceFile *resource_file, const char *camera_name, const ResourceDirectories *directories);
};
