/*******************************************************************************
 *  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.baselibs;

import cdac.medinfo.sdk.dcm30_04.commoninterface.IDataElement;
import cdac.medinfo.sdk.dcm30_04.commoninterface.IDicomValue;
import cdac.medinfo.sdk.dcm30_04.commoninterface.IDictionaryReader;
import cdac.medinfo.sdk.dcm30_04.commoninterface.ITransferSyntax;
import cdac.medinfo.sdk.dcm30_04.exceptions.InvalidItemException;
import cdac.medinfo.sdk.dcm30_04.exceptions.MandatoryMissingException;
import cdac.medinfo.sdk.dcm30_04.exceptions.ValidationException;
import cdac.medinfo.sdk.dcm30_04.utils.DicomConfig;
import cdac.medinfo.sdk.dcm30_04.utils.DicomConstants;
import cdac.medinfo.sdk.dcm30_04.utils.DicomLogger;

/**
* This item class contains the methods to set, get and validate the attribute present in Configuration QA Results Sequence .
 */

public class ConfigurationQAResultsSequenceItem extends Item
{

	private static final long serialVersionUID = 1L;
	/**
	 * This constructor creates the item with default TransferSyntax 
	 */
	ConfigurationQAResultsSequenceItem()
	{
		super();
	}

	/*
	 * This constructor calls the respective superclass constructor
	 * This constructor should throw exception if null TS is tried to be set
	 */
	/**
	 * This constructor creates the item with specified TransferSyntax 
	 * and default DictionaryReader
	 * @param objITransferSyntax specifies the DICOM Standard defined TransfeSyntax
	 */
	ConfigurationQAResultsSequenceItem(ITransferSyntax objITransferSyntax)
	{
		super(objITransferSyntax);
	}

	/**
	 * This constructor creates ConfigurationQAResultsSequenceItem with specified TransferSyntax and
	 * specified DictionaryReader.
	 * @param objTransferSyntax specifies the DICOM Standard defined TransfeSyntax.
	 * @param objDictionaryReader specifies the DICOM Dictionary reader to be used.
	 */
	ConfigurationQAResultsSequenceItem(ITransferSyntax objTransferSyntax, IDictionaryReader objDictionaryReader)
	{
		super(objTransferSyntax,objDictionaryReader);
	}
	/*
	 * (non-Javadoc) This method validates the contents of the Item
	 * @see cdac.medinfo.sdk.dcm30_04.commoninterface.IItem#validate()
	 */
	/**
	 * Validates all the attributes in ConfigurationQAResultsSequenceItem that are present in the DataSet
	 * @return boolean - Success -true, Failure - false
	 * @throws InvalidItemException throws InvalidItemException If Mandatory or Conditional element fails.
	 */
	public boolean validateForModule()  throws InvalidItemException
	{
		try
		{
	
		}
		catch(MandatoryMissingException me)
		{
			if(DicomConfig.createInstance().isLoggingOn())
			{
				DicomLogger.getLogger().log(me.getMessage());
			}
			throw new ValidationException(this.getClass().getSimpleName(),me);
		}
		return true;
	}
	/**
	 * Retrieves pre-initialized object of Display Calibration ResultSequence.If the module contains the sequence object it returns the same otherwise it creates the sequence adds to the module with proper initialization and then returns 	the object of sequence.
	 * @return DisplayCalibrationResultSequence - instance of Display Calibration ResultSequence. 
	 */
	public DisplayCalibrationResultSequence getDisplayCalibrationResultSequence()
	{
		DisplayCalibrationResultSequence objDisplayCalibrationResultSequence = null;
		IDataElement objIDataElement =  getDataForTag(0x0028, 0x7016); //getDataElement
		if(objIDataElement != null)
		{
			IDicomValue objIDicomValue = objIDataElement.getDicomValue();
			if(objIDicomValue != null)
				objDisplayCalibrationResultSequence = (DisplayCalibrationResultSequence)objIDicomValue;
		}
		else
		{
			DicomV3Factory objDicomV3Factory = DicomV3Factory.createInstance();
			int iVRTransferSyntax = objITransferSyntax.getVRTransferSyntax();
			objIDataElement = null;
			objDisplayCalibrationResultSequence = (DisplayCalibrationResultSequence)objDicomV3Factory.createSequence(0x0028, 0x7016, objITransferSyntax, objIDictionaryReader);

			if(iVRTransferSyntax == DicomConstants.DCM_VR_IMPLICIT)
				objIDataElement = new ImplicitDE(0x0028, 0x7016, objDisplayCalibrationResultSequence.getValue(), objIDictionaryReader);
			else
				objIDataElement = new ExplicitDE(0x0028, 0x7016, DicomConstants.DCM_DT_SQ, objDisplayCalibrationResultSequence.getValue());
			objIDataElement.setTransferSyntax(objITransferSyntax);
			if(objIDataElement != null)
				addDataElement(objIDataElement);
		}
		return objDisplayCalibrationResultSequence;
	}
	
	/**
	 * Retrieves pre-initialized object of Visual Evaluation Result Sequence.If the module contains the sequence object it returns the same otherwise it creates the sequence adds to the module with proper initialization and then returns 	the object of sequence.
	 * @return VisualEvaluationResultSequence - instance of VisualEvaluationResultSequence. 
	 */
	public VisualEvaluationResultSequence getVisualEvaluationResultSequence()
	{
		VisualEvaluationResultSequence objVisualEvaluationResultSequence = null;
		IDataElement objIDataElement =  getDataForTag(0x0028, 0x7015); //getDataElement
		if(objIDataElement != null)
		{
			IDicomValue objIDicomValue = objIDataElement.getDicomValue();
			if(objIDicomValue != null)
				objVisualEvaluationResultSequence = (VisualEvaluationResultSequence)objIDicomValue;
		}
		else
		{
			DicomV3Factory objDicomV3Factory = DicomV3Factory.createInstance();
			int iVRTransferSyntax = objITransferSyntax.getVRTransferSyntax();
			objIDataElement = null;
			objVisualEvaluationResultSequence = (VisualEvaluationResultSequence)objDicomV3Factory.createSequence(0x0028, 0x7015, objITransferSyntax, objIDictionaryReader);

			if(iVRTransferSyntax == DicomConstants.DCM_VR_IMPLICIT)
				objIDataElement = new ImplicitDE(0x0028, 0x7015, objVisualEvaluationResultSequence.getValue(), objIDictionaryReader);
			else
				objIDataElement = new ExplicitDE(0x0028, 0x7015, DicomConstants.DCM_DT_SQ, objVisualEvaluationResultSequence.getValue());
			objIDataElement.setTransferSyntax(objITransferSyntax);
			if(objIDataElement != null)
				addDataElement(objIDataElement);
		}
		return objVisualEvaluationResultSequence;
	}
	/**
	 * Retrieves pre-initialized object of Luminance Uniformity Result Sequence.If the module contains the sequence object it returns the same otherwise it creates the sequence adds to the module with proper initialization and then returns 	the object of sequence.
	 * @return LuminanceUniformityResultSequence - instance of LuminanceUniformityResultSequence. 
	 */
	public LuminanceUniformityResultSequence getLuminanceUniformityResultSequence()
	{
		LuminanceUniformityResultSequence objLuminanceUniformityResultSequence = null;
		IDataElement objIDataElement =  getDataForTag(0x0028, 0x7027); //getDataElement
		if(objIDataElement != null)
		{
			IDicomValue objIDicomValue = objIDataElement.getDicomValue();
			if(objIDicomValue != null)
				objLuminanceUniformityResultSequence = (LuminanceUniformityResultSequence)objIDicomValue;
		}
		else
		{
			DicomV3Factory objDicomV3Factory = DicomV3Factory.createInstance();
			int iVRTransferSyntax = objITransferSyntax.getVRTransferSyntax();
			objIDataElement = null;
			objLuminanceUniformityResultSequence = (LuminanceUniformityResultSequence)objDicomV3Factory.createSequence(0x0028, 0x7027, objITransferSyntax, objIDictionaryReader);

			if(iVRTransferSyntax == DicomConstants.DCM_VR_IMPLICIT)
				objIDataElement = new ImplicitDE(0x0028, 0x7027, objLuminanceUniformityResultSequence.getValue(), objIDictionaryReader);
			else
				objIDataElement = new ExplicitDE(0x0028, 0x7027, DicomConstants.DCM_DT_SQ, objLuminanceUniformityResultSequence.getValue());
			objIDataElement.setTransferSyntax(objITransferSyntax);
			if(objIDataElement != null)
				addDataElement(objIDataElement);
		}
		return objLuminanceUniformityResultSequence;
	}
	/**
	 * Retrieves pre-initialized object of Luminance Result Sequence.If the module contains the sequence object it returns the same otherwise it creates the sequence adds to the module with proper initialization and then returns 	the object of sequence.
	 * @return LuminanceResultSequence - instance of LuminanceResultSequence. 
	 */
	public LuminanceResultSequence getLuminanceResultSequence()
	{
		LuminanceResultSequence objLuminanceResultSequence = null;
		IDataElement objIDataElement =  getDataForTag(0x0028, 0x7024); //getDataElement
		if(objIDataElement != null)
		{
			IDicomValue objIDicomValue = objIDataElement.getDicomValue();
			if(objIDicomValue != null)
				objLuminanceResultSequence = (LuminanceResultSequence)objIDicomValue;
		}
		else
		{
			DicomV3Factory objDicomV3Factory = DicomV3Factory.createInstance();
			int iVRTransferSyntax = objITransferSyntax.getVRTransferSyntax();
			objIDataElement = null;
			objLuminanceResultSequence = (LuminanceResultSequence)objDicomV3Factory.createSequence(0x0028, 0x7024, objITransferSyntax, objIDictionaryReader);

			if(iVRTransferSyntax == DicomConstants.DCM_VR_IMPLICIT)
				objIDataElement = new ImplicitDE(0x0028, 0x7024, objLuminanceResultSequence.getValue(), objIDictionaryReader);
			else
				objIDataElement = new ExplicitDE(0x0028, 0x7024, DicomConstants.DCM_DT_SQ, objLuminanceResultSequence.getValue());
			objIDataElement.setTransferSyntax(objITransferSyntax);
			if(objIDataElement != null)
				addDataElement(objIDataElement);
		}
		return objLuminanceResultSequence;
	}
	
}
