#ifndef LIGHTEMITTINGDIODE_HPP_INCLUDED
#define LIGHTEMITTINGDIODE_HPP_INCLUDED

#include <iostream>
#include <memory>
#include <optional>
#include <set>
#include <string>
#include <vector>
#include <NBO/NBO/LEDModule.h>
#include <NBO/NBO/LightEmittingDiodeType_Type.h>
#include <NBO/NBO/LightSource_Type.h>
#include <NBO/NBO/ENBOType.h>
#include <NBO/NBOGlobal.h>
#include <NBO/Shared/Base/NBOBaseClass.h>


namespace Inscoper::NBO {

/*!
* \brief Represents the XML element LightEmittingDiode.
*
* A Light Emitting Diode (LED) is a semiconductor light source that emits light when current flows through it. Electrons in the semiconductor recombine with electron holes, releasing energy in the form of photons. The color of the light (corresponding to the energy of the photons) is determined by the energy required for electrons to cross the band gap of the semiconductor. White light may be obtained by using multiple semiconductors or a layer of light-emitting phosphor on the semiconductor device.
*/
class NBO_EXPORT LightEmittingDiode : public LightSource_Type {

public:
	
	LightEmittingDiode();
	~LightEmittingDiode();

	/*!
	* \brief Cast a NBOBaseClass to a LightEmittingDiode.
	*
	* \param base The base class to cast
	* \return The casted element, or nullptr if the cast fails
	*/
	static std::shared_ptr<LightEmittingDiode> fromBase(NBOBaseClassPtr base);

	/*!
	* \brief Returns the class type name.
	*
	* \return The class type name
	*/
	std::string getTypeName() const override;

	/*!
	* \brief Returns the XML element name corresponding to this class.
	*
	* \return The XML element name
	*/
	std::string getXMLName() const override;

	/*!
	* \brief Returns the NBO Type corresponding to this class.
	*
	* \return The NBO Type value
	*/
	ENBOType getNBOType() const override;

	/*!
	* \brief Returns a list of all classes derived from this class.
	*
	* \return The list of derived classes
	*/
	std::vector<NBOBaseClassPtr> getChildren() const override;

	/*!
	* \brief Returns a list of all child elements contained in this class.
	*
	* \return The list of child classes
	*/
	std::vector<NBOBaseClassPtr> getSubElements() const override;

	/*!
	* \brief Populates this object from a JSON file.
	*
	* \param path The path to the JSON file
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void fromJsonFile(const std::string& path, bool validate = true);

	/*!
	* \brief Populates this object from a JSON string.
	*
	* \param json_string The JSON content as a string
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void fromJsonString(const std::string& json_string, bool validate = true);

	/*!
	* \brief Populates this object from a XML file.
	*
	* \param path The path to the XML file
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void fromXmlFile(const std::string& path, bool validate = true);

	/*!
	* \brief Populates this object from a XML string.
	*
	* \param xml_string The XML content as a string
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void fromXmlString(const std::string& xml_string, bool validate = true);

	/*!
	* \brief Serializes this object to an XML file.
	*
	* \param filename The path to the output XML file
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void toXmlFile(const std::string& filename, bool validate = true) const;

	/*!
	* \brief Serializes this object to an XML string.
	*
	* \param validate If true, validates constraints on value. Default is true.
	* \return A string containing the XML representation of this object
	*/
	std::string toXmlString(bool validate = true) const;

	/*!
	* \brief Sets the value of the Type attribute.
	*
	* This field captures the general category of this Light Emitting Diode.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setType(const Inscoper::NBO::LightEmittingDiodeType_TypePtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the Type attribute.
	*
	* This field captures the general category of this Light Emitting Diode.
	*
	* \return The value of the attribute
	*/
	LightEmittingDiodeType_TypePtr getType() const;

	/*!
	* \brief Resets the Type attribute to an unset state.
	*
	* This field captures the general category of this Light Emitting Diode.
	*/
	void resetType();

	/*!
	* \brief Checks whether the optional Type attribute is present.
	*
	* This field captures the general category of this Light Emitting Diode.
	*
	* \return true if the optional attribute has been set, false otherwise
	*/
	bool hasType() const;

	/*!
	* \brief Sets the list of LEDModule elements.
	*
	* No description available in the XSD standard.
	*
	* \param value The new list of LEDModule elements
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setLEDModule_List(const std::vector<Inscoper::NBO::LEDModulePtr>& value, bool validate = true);

	/*!
	* \brief Returns the list of LEDModule elements.
	*
	* No description available in the XSD standard.
	*
	* \return The list of LEDModule elements
	*/
	std::vector<Inscoper::NBO::LEDModulePtr> getLEDModule_List() const;

	/*!
	* \brief Adds a new LEDModule element to this object.
	*
	* No description available in the XSD standard.
	*
	* \param value The element to add
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void addToLEDModule_List(const Inscoper::NBO::LEDModulePtr& value, bool validate = true);

	/*!
	* \brief Clear the list of LEDModule.
	*
	* No description available in the XSD standard.
	*/
	void clearLEDModule_List();


private:
	class Impl;
	std::unique_ptr<Impl> pImpl;

	LightEmittingDiodeType_TypePtr Type = nullptr; // Required attribute
    std::vector<Inscoper::NBO::LEDModulePtr> LEDModule_List;
};

/*! Shared pointer for LightEmittingDiode*/
typedef std::shared_ptr<LightEmittingDiode> LightEmittingDiodePtr;

} // namespace Inscoper::NBO

#endif // LIGHTEMITTINGDIODE_HPP_INCLUDED