/*******************************************************************************
 *  Copyright 2017-2018 Centre for Development of Advanced Computing(C-DAC), Pune
 *  
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *  
 *   http://www.apache.org/licenses/LICENSE-2.0
 *  
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *******************************************************************************/
package cdac.medinfo.sdk.dcm30_04.dicommodel.modules;

import cdac.medinfo.sdk.dcm30_04.baselibs.OphthalmicAcquisitionParametersMacro;
import cdac.medinfo.sdk.dcm30_04.baselibs.Tag;
import cdac.medinfo.sdk.dcm30_04.commoninterface.IDataSet;
import cdac.medinfo.sdk.dcm30_04.commoninterface.ITag;

import cdac.medinfo.sdk.dcm30_04.exceptions.ConditionFailedException;
import cdac.medinfo.sdk.dcm30_04.exceptions.InvalidItemException;
import cdac.medinfo.sdk.dcm30_04.exceptions.InvalidModuleException;
import cdac.medinfo.sdk.dcm30_04.exceptions.MandatoryMissingException;
import cdac.medinfo.sdk.dcm30_04.utils.DicomConfig;
import cdac.medinfo.sdk.dcm30_04.utils.DicomConstants;
import cdac.medinfo.sdk.dcm30_04.utils.DicomLogger;
import cdac.medinfo.sdk.dcm30_04.utils.ISingleCollection;
import cdac.medinfo.sdk.dcm30_04.utils.SingleCollection;
/**
 \* This module specifies the attributes that describe an Ophthalmic Tomography Acquisition Parameters Module.
 */
public class OphthalmicTomographyAcquisitionParametersModule extends Module  
{

	 
	 /**
	  * The obj single collection.
	  */
	 public static ISingleCollection<ITag> objSingleCollection = null;
	 
	 	
	 	/**
		 * The obj Ophthalmic Acquisition Parameters Macro.
		 */
		OphthalmicAcquisitionParametersMacro objOphthalmicAcquisitionParametersMacro = null;


		/**
		 * Creates Ophthalmic Tomography Acquisition Parameters Module with default initialization.
		 * 
		 * @param objIDataSet the obj i data set
		 */
		public OphthalmicTomographyAcquisitionParametersModule(IDataSet objIDataSet)
		{
			super(objIDataSet);
		}

		static
		{

			objSingleCollection = new SingleCollection<ITag>();
			objSingleCollection.add(new Tag(0x0022,0x0030)); 
			objSingleCollection.add(new Tag(0x0022,0x000C));  
			
		}
		/**
		 * This method validates each Attribute in the Module according to the Type
		 * of the Attribute.Attributes are of 5 types.
		 * Type 1,Type 2 are Mandatory:
		 * Mandatory Attributes have to present in the Module.
		 * Type 1C,2C are Conditional:
		 * Conditional Attributes' presence depend on a condition.
		 * If the condition is satisfied the Attribute has to be present.
		 * Type 3 are Optional
		 * Optional Attributes can be added as and when required.
		 * 
		 * @return boolean - returns validation status as success or failure
		 * 
		 * @throws InvalidModuleException - If validation of Module fails
		 */
		public  boolean validateModule() throws InvalidModuleException
		{

			try
			{		
				getOphthalmicAcquisitionParametersMacro().validate();
				if(!isPresent(0x0022,0x0030))
					throw new MandatoryMissingException("0022,0030");
				if(!isPresent(0x0022,0x000C2))
					throw new MandatoryMissingException("0022,000C2");
			}catch(MandatoryMissingException mme)
			{
				if(DicomConfig.createInstance().isLoggingOn())
					DicomLogger.getLogger().log(mme.getMessage());

				
					throw new InvalidModuleException(this.getClass().getSimpleName(),mme);

			}
			catch(ConditionFailedException cfe)
			{
				if(DicomConfig.createInstance().isLoggingOn())
					DicomLogger.getLogger().log(cfe.getMessage());

				
					throw new InvalidModuleException(this.getClass().getSimpleName(),cfe);

			}
			catch(InvalidItemException iie)
			{
				if(DicomConfig.createInstance().isLoggingOn())
					DicomLogger.getLogger().log(iie.getMessage());

				
					throw new InvalidModuleException(this.getClass().getSimpleName(),iie);

			}
			return true;
		}

		/**
		 * Sets Axial Length of the Eye
		 * @param fAxialLengthOfTheEye Float value of the Axial Length of the Eye
		 */
		public void setAxialLengthOfTheEye( float fAxialLengthOfTheEye)
		{
			/*
			 * Accept the Axial Length of the Eye in String format of type FL.
			 * Read the Transfer Syntax and check if ImplicitDE or ExplicitDE to create
			 * Set the iGroupNumber and iElementNumber to ImplicitDE object 
			 * Set the iVRType
			 * Set length from the element
			 * Add this element to the Data Set
			 */
			addDataElement(0x0022,0x0030, DicomConstants.DCM_DT_FL,fAxialLengthOfTheEye);
		}
		/**
		 * Retrieves Axial Length of the Eye
		 * @return float - Float value of the Axial Length of the Eye
		 */
		public float getAxialLengthOfTheEye()
		{
			Object objValue = getValue(0x0022,0x0030);
			if(objValue != null)
				return Float.parseFloat(objValue.toString());
			return DicomConstants.DCM_NO_VALUE;
		}

		/**
		 * Sets Horizontal Field of View
		 * @param fHorizontalFieldOfView Float value of the Horizontal Field of View
		 */
		public void setHorizontalFieldOfView( float fHorizontalFieldOfView)
		{
			/*
			 * Accept the Horizontal Field of View in String format of type FL.
			 * Read the Transfer Syntax and check if ImplicitDE or ExplicitDE to create
			 * Set the iGroupNumber and iElementNumber to ImplicitDE object 
			 * Set the iVRType
			 * Set length from the element
			 * Add this element to the Data Set
			 */
			addDataElement(0x0022,0x000C2, DicomConstants.DCM_DT_FL,fHorizontalFieldOfView);
		}
		/**
		 * Retrieves Horizontal Field of View
		 * @return float - Float value of the Horizontal Field of View
		 */
		public float getHorizontalFieldOfView()
		{
			Object objValue = getValue(0x0022,0x000C2);
			if(objValue != null)
				return Float.parseFloat(objValue.toString());
			return DicomConstants.DCM_NO_VALUE;
		}
		
		/**
		 * Get the Instance of Ophthalmic Acquisition Parameters Macro.Attributes related to OphthalmicAcquisitionParameters Macro will be set in Macro
		 * using the setter methods provided in the Macro.Calling this method multiple times will return the same Marco
		 * Instance that was created at first. Hence, any attributes in this Macro,if set multiple times will contain the value that was
		 * set in the last call to its setter method.
		 * 
		 * @return - object of Ophthalmic Acquisition Parameters Macro which the user programmer can populate
		 */
		public OphthalmicAcquisitionParametersMacro getOphthalmicAcquisitionParametersMacro()
		{
			if(objOphthalmicAcquisitionParametersMacro == null)
				objOphthalmicAcquisitionParametersMacro = new OphthalmicAcquisitionParametersMacro(objIDataSet);
			return objOphthalmicAcquisitionParametersMacro; 
		}
}
