/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2016 Raytrix GmbH. All rights reserved.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#pragma once

#include "DLLInterface.h"
#include "Camera.h"

#include "Rx.Core.Ex/RxMetaData.h"
#include "Rx.Core/RxCalibMetaData.h"

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// namespace: Rx
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
namespace Rx
{
	namespace LFR
	{
		// Forward declaration
		class CCudaCompute;

		/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>
		///		The LFR Meta Data class
		/// </summary>
		/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
		class RX_API CMetaData : public CRxMetaData
		{
		public:

			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			/// <summary>
			/// 	Default constructor. Does not allocate image memory.
			/// </summary>
			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			CMetaData();

			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			/// <summary>
			/// 	Move constructor.
			/// </summary>
			///
			/// <param name="xMetaData"> [in,out] The meta data. </param>
			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			CMetaData(const CMetaData& xMetaData);

			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			/// <summary>
			/// 	Destructor. Frees all used memory.
			/// </summary>
			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			~CMetaData();

		public:

			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			/// <summary>
			/// 	Move assignment operator.
			/// </summary>
			///
			/// <param name="xMetaData"> [in,out]The meta data. </param>
			///
			/// <returns> The instance. </returns>
			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			CMetaData& operator=(CMetaData&& xMetaData);

		public:

			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			/// <summary>
			/// 	Updates the meta data from a CUDA compute instance.
			/// </summary>
			///
			/// <param name="xCudaCompute"> The CUDA compute instance. </param>
			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			void UpdateFrom(const CCudaCompute& xCudaCompute);

			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			/// <summary>
			/// 	Updates the meta data from a camera instance.
			/// </summary>
			///
			/// <param name="xCamera"> [in,out] The camera. </param>
			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			void UpdateFrom(CCamera& xCamera);

			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			/// <summary>
			/// 	Updates the meta data from a calibration meta data instance.
			/// </summary>
			///
			/// <param name="xCalibMetaData"> Information describing the calib meta. </param>
			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			void UpdateFrom(const CRxCalibMetaData& xCalibMetaData);

			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			/// <summary>
			/// 	Writes the application details to the meta data.
			/// </summary>
			///
			/// <param name="sxAppName">    Name of the application. </param>
			/// <param name="sxAppVersion"> The application version. </param>
			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			void AddApplicationDetail(const CRxString& sxAppName, const CRxString& sxAppVersion);
		};
	}
}
