#ifndef OpenTestSystem_OtxDiagManager_OtxDiagApi_OtxDataTypeFactory_H
#define OpenTestSystem_OtxDiagManager_OtxDiagApi_OtxDataTypeFactory_H

#include "ApiDefs.h"
#include "TypeDefs.h"
#include <string>
#include <memory>

namespace OpenTestSystem { namespace OtxDiagManager { namespace OtxDiagApi { namespace OtxDataTypes {
	class IOtxValue;
	class IOtxRequestParameter;
	class IOtxRequestParameters;
	class IOtxResponseParameter;
	class IOtxResponseParameters;
}}}}

namespace OpenTestSystem { 
	/// <summary>
	/// Namespace containing all objects for the communication to various, interchangeable diagnostic runtime systems, e.g. standardized MVCI-Server or proprietary diagnostic runtime systems.
	/// </summary>
	namespace OtxDiagManager {
	/// <summary>
	/// Namespace covering all actions and terms of all diagnostic related OTX extension by an identical mehod. Therfore this namespace is 100% OTX standard compliant. The specification can be found in ISO 13209 parts 3 and 4.
	/// </summary>
	namespace OtxDiagApi {
	/// <summary>
	/// Factory class for creating the OtxDataTypeFactory
	/// </summary>
	class OtxDataTypeFactory
	{
	protected:
		OtxDataTypeFactory();
	public:
		virtual ~OtxDataTypeFactory();
		/// <summary>
		/// Creates a IOtxValue instance
		/// </summary>
		API_EXPORTS static std::shared_ptr<OpenTestSystem::OtxDiagManager::OtxDiagApi::OtxDataTypes::IOtxValue> CreateValue();
		/// <summary>
		/// Creates a IOtxRequestParameter instance of OtxRequestParameter
		/// </summary>
		/// <param name="path">The path to the desired parameter</param>
		API_EXPORTS static std::shared_ptr<OpenTestSystem::OtxDiagManager::OtxDiagApi::OtxDataTypes::IOtxRequestParameter> CreateRequestParameter(const char * path);
		/// <summary>
		/// Creates a IOtxRequestParameter instance of OtxRequestParameter
		/// </summary>
		/// <param name="path">The path to the desired parameter</param>
		/// <param name="valueAsString">The value as string of the request parameter</param>
		API_EXPORTS static std::shared_ptr<OpenTestSystem::OtxDiagManager::OtxDiagApi::OtxDataTypes::IOtxRequestParameter> CreateRequestParameter(const char * path, const char * valueAsString);
		/// <summary>
		/// Creates a IOtxRequestParameters instance of OtxRequestParameters
		/// </summary>
		API_EXPORTS static std::shared_ptr<OpenTestSystem::OtxDiagManager::OtxDiagApi::OtxDataTypes::IOtxRequestParameters> CreateRequestParameters();
		/// <summary>
		/// Creates a IOtxResponseParameter instance of OtxResponseParameter
		/// </summary>
		/// <param name="path">The path to the desired parameter</param>
		API_EXPORTS static std::shared_ptr<OpenTestSystem::OtxDiagManager::OtxDiagApi::OtxDataTypes::IOtxResponseParameter> CreateResponseParameter(const char* path);
		/// <summary>
		/// Creates a IOtxResponseParameters instance of OtxResponseParameters
		/// </summary>
		/// <param name="responseName">The short name of response</param>
		API_EXPORTS static std::shared_ptr<OpenTestSystem::OtxDiagManager::OtxDiagApi::OtxDataTypes::IOtxResponseParameters> CreateResponseParameters(const char* responseName);
	private:
		class impl;
		std::unique_ptr<impl> pimpl;
	};
}}}
#endif // OpenTestSystem_OtxDiagManager_OtxDiagApi_OtxDataTypeFactory_H