#pragma once

#include "BsEditorPrerequisites.h"
#include "BsIReflectable.h"

namespace BansheeEngine
{
	/**
	 * @brief	Contains meta-data for a resource stored in the ProjectLibrary.
	 */
	class ProjectResourceMeta : public IReflectable
	{
	private:
		struct ConstructPrivately {};

	public:
		explicit ProjectResourceMeta(const ConstructPrivately&);

		/**
		 * @brief	Creates a new project library resource meta-data entry.
		 *
		 * @param	uuid				UUID of the resource.
		 * @param	typeId				RTTI type id of the resource.
		 * @param	resourceMetaData	Non-project library specific meta-data.
		 * @param	importOptions		Import options used for importing the resource.
		 *
		 * @return	New project library resource meta data instance.
		 */
		static ProjectResourceMetaPtr create(const String& uuid, UINT32 typeId, const ResourceMetaDataPtr& resourceMetaData,
			const ImportOptionsPtr& importOptions);

		/**
		 * @brief	Returns the UUID of the resource this meta data belongs to.
		 */
		const String& getUUID() const { return mUUID; }

		/**
		 * @brief	Returns the non-project library specific meta-data,
		 */
		ResourceMetaDataPtr getResourceMetaData() const { return mResourceMeta; }

		/**
		 * @brief	Returns the import options used for importing the resource this
		 *			object is referencing.
		 */
		const ImportOptionsPtr& getImportOptions() const { return mImportOptions; }

		/**
		 * @brief	Returns the RTTI type ID of the resource this object is referencing.
		 */
		UINT32 getTypeID() const { return mTypeId; }

		/**
		 * @brief	Checks should this resource always be included in the build, regardless if
		 *			it's being referenced or not.
		 */
		bool getIncludeInBuild() const { return mIncludeInBuild; }

		/**
		 * @brief	Determines if this resource will always be included in the build, regardless if
		 *			it's being referenced or not.
		 */
		void setIncludeInBuild(bool include) { mIncludeInBuild = include; }

	private:
		String mUUID;
		ResourceMetaDataPtr mResourceMeta;
		ImportOptionsPtr mImportOptions;
		UINT32 mTypeId;
		bool mIncludeInBuild;

		/************************************************************************/
		/* 								RTTI		                     		*/
		/************************************************************************/

		/**
		 * @brief	Creates a new empty meta-data instance. Used only for serialization purposes.
		 */
		static ProjectResourceMetaPtr createEmpty();

	public:
		friend class ProjectResourceMetaRTTI;
		static RTTITypeBase* getRTTIStatic();
		virtual RTTITypeBase* getRTTI() const override;	
	};
}