#ifndef FIELDUNIFORMITYEVALUATION_HPP_INCLUDED
#define FIELDUNIFORMITYEVALUATION_HPP_INCLUDED

#include <iostream>
#include <memory>
#include <optional>
#include <set>
#include <string>
#include <vector>
#include <NBO/NBO/FlatFieldImageRef.h>
#include <NBO/NBO/LSID_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 FieldUniformityEvaluation.
*
* This describes the procedure that was used to measure the Field dependent variations in the pixel-to-pixel sensitivity of the detector and/or by distortions in the optical path.
*/
class NBO_EXPORT FieldUniformityEvaluation : public NBOBaseClass {

public:
	
	FieldUniformityEvaluation();
	~FieldUniformityEvaluation();

	/*!
	* \brief Cast a NBOBaseClass to a FieldUniformityEvaluation.
	*
	* \param base The base class to cast
	* \return The casted element, or nullptr if the cast fails
	*/
	static std::shared_ptr<FieldUniformityEvaluation> 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 ID attribute.
	*
	* A Unique Identifier for this component.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setID(const Inscoper::NBO::LSID_TypePtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the ID attribute.
	*
	* A Unique Identifier for this component.
	*
	* \return The value of the attribute
	*/
	LSID_TypePtr getID() const;

	/*!
	* \brief Resets the ID attribute to an unset state.
	*
	* A Unique Identifier for this component.
	*/
	void resetID();

	/*!
	* \brief Checks whether the optional ID attribute is present.
	*
	* A Unique Identifier for this component.
	*
	* \return true if the optional attribute has been set, false otherwise
	*/
	bool hasID() const;

	/*!
	* \brief Sets the value of the MaxIntensityPixelXCoordinate attribute.
	*
	* This field reports the x-axis coordinate of the Pixel that has the Maximum Intensity in the Image used for this Flat Field Calibration procedure.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setMaxIntensityPixelXCoordinate(const float& value, bool validate = true);

	/*!
	* \brief Returns the value of the MaxIntensityPixelXCoordinate attribute.
	*
	* This field reports the x-axis coordinate of the Pixel that has the Maximum Intensity in the Image used for this Flat Field Calibration procedure.
	*
	* \return The value of the attribute
	*/
	float getMaxIntensityPixelXCoordinate() const;

	/*!
	* \brief Resets the MaxIntensityPixelXCoordinate attribute to an unset state.
	*
	* This field reports the x-axis coordinate of the Pixel that has the Maximum Intensity in the Image used for this Flat Field Calibration procedure.
	*/
	void resetMaxIntensityPixelXCoordinate();

	/*!
	* \brief Checks whether the MaxIntensityPixelXCoordinate attribute is present.
	*
	* This field reports the x-axis coordinate of the Pixel that has the Maximum Intensity in the Image used for this Flat Field Calibration procedure.
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasMaxIntensityPixelXCoordinate() const;

	/*!
	* \brief Sets the value of the MaxIntensityPixelYCoordinate attribute.
	*
	* This field reports the y-axis coordinate of the Pixel that has the Maximum Intensity in the Image used for this Flat Field Calibration procedure.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setMaxIntensityPixelYCoordinate(const float& value, bool validate = true);

	/*!
	* \brief Returns the value of the MaxIntensityPixelYCoordinate attribute.
	*
	* This field reports the y-axis coordinate of the Pixel that has the Maximum Intensity in the Image used for this Flat Field Calibration procedure.
	*
	* \return The value of the attribute
	*/
	float getMaxIntensityPixelYCoordinate() const;

	/*!
	* \brief Resets the MaxIntensityPixelYCoordinate attribute to an unset state.
	*
	* This field reports the y-axis coordinate of the Pixel that has the Maximum Intensity in the Image used for this Flat Field Calibration procedure.
	*/
	void resetMaxIntensityPixelYCoordinate();

	/*!
	* \brief Checks whether the MaxIntensityPixelYCoordinate attribute is present.
	*
	* This field reports the y-axis coordinate of the Pixel that has the Maximum Intensity in the Image used for this Flat Field Calibration procedure.
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasMaxIntensityPixelYCoordinate() const;

	/*!
	* \brief Sets the value of the MeanMaxtoCornerIntensityRatio attribute.
	*
	* This field reports the Mean between the Ratios obtained by comparing the Maximum Pixel Intensity and the Intensities of the four corner Pixels of the Image used for this Flat Field Calibration procedure.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setMeanMaxtoCornerIntensityRatio(const float& value, bool validate = true);

	/*!
	* \brief Returns the value of the MeanMaxtoCornerIntensityRatio attribute.
	*
	* This field reports the Mean between the Ratios obtained by comparing the Maximum Pixel Intensity and the Intensities of the four corner Pixels of the Image used for this Flat Field Calibration procedure.
	*
	* \return The value of the attribute
	*/
	float getMeanMaxtoCornerIntensityRatio() const;

	/*!
	* \brief Resets the MeanMaxtoCornerIntensityRatio attribute to an unset state.
	*
	* This field reports the Mean between the Ratios obtained by comparing the Maximum Pixel Intensity and the Intensities of the four corner Pixels of the Image used for this Flat Field Calibration procedure.
	*/
	void resetMeanMaxtoCornerIntensityRatio();

	/*!
	* \brief Checks whether the MeanMaxtoCornerIntensityRatio attribute is present.
	*
	* This field reports the Mean between the Ratios obtained by comparing the Maximum Pixel Intensity and the Intensities of the four corner Pixels of the Image used for this Flat Field Calibration procedure.
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasMeanMaxtoCornerIntensityRatio() const;

	/*!
	* \brief Sets the value of the SDMaxtoCornerIntensityRatio attribute.
	*
	* This field reports the Standard Deviation between the Ratios obtained by comparing the Maximum Pixel Intensity and the Intensities of the four corner Pixels of the Image used for this Flat Field Calibration procedure.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setSDMaxtoCornerIntensityRatio(const float& value, bool validate = true);

	/*!
	* \brief Returns the value of the SDMaxtoCornerIntensityRatio attribute.
	*
	* This field reports the Standard Deviation between the Ratios obtained by comparing the Maximum Pixel Intensity and the Intensities of the four corner Pixels of the Image used for this Flat Field Calibration procedure.
	*
	* \return The value of the attribute
	*/
	float getSDMaxtoCornerIntensityRatio() const;

	/*!
	* \brief Resets the SDMaxtoCornerIntensityRatio attribute to an unset state.
	*
	* This field reports the Standard Deviation between the Ratios obtained by comparing the Maximum Pixel Intensity and the Intensities of the four corner Pixels of the Image used for this Flat Field Calibration procedure.
	*/
	void resetSDMaxtoCornerIntensityRatio();

	/*!
	* \brief Checks whether the SDMaxtoCornerIntensityRatio attribute is present.
	*
	* This field reports the Standard Deviation between the Ratios obtained by comparing the Maximum Pixel Intensity and the Intensities of the four corner Pixels of the Image used for this Flat Field Calibration procedure.
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasSDMaxtoCornerIntensityRatio() const;

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

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

	/*!
	* \brief Adds a new FlatFieldImageRef 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 addToFlatFieldImageRef_List(const Inscoper::NBO::FlatFieldImageRefPtr& value, bool validate = true);

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


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

	LSID_TypePtr ID = nullptr; // Required attribute
    std::optional<float> MaxIntensityPixelXCoordinate; // Optional attribute
    std::optional<float> MaxIntensityPixelYCoordinate; // Optional attribute
    std::optional<float> MeanMaxtoCornerIntensityRatio; // Optional attribute
    std::optional<float> SDMaxtoCornerIntensityRatio; // Optional attribute
    std::vector<Inscoper::NBO::FlatFieldImageRefPtr> FlatFieldImageRef_List;
};

/*! Shared pointer for FieldUniformityEvaluation*/
typedef std::shared_ptr<FieldUniformityEvaluation> FieldUniformityEvaluationPtr;

} // namespace Inscoper::NBO

#endif // FIELDUNIFORMITYEVALUATION_HPP_INCLUDED