package org.atdl4j.data;

import java.math.BigInteger;

import org.atdl4j.data.converter.DateTimeConverter;
import org.atdl4j.fixatdl.core.AmtT;
import org.atdl4j.fixatdl.core.BooleanT;
import org.atdl4j.fixatdl.core.CharT;
import org.atdl4j.fixatdl.core.CountryT;
import org.atdl4j.fixatdl.core.CurrencyT;
import org.atdl4j.fixatdl.core.DataT;
import org.atdl4j.fixatdl.core.EnumPairT;
import org.atdl4j.fixatdl.core.ExchangeT;
import org.atdl4j.fixatdl.core.FloatT;
import org.atdl4j.fixatdl.core.IntT;
import org.atdl4j.fixatdl.core.LanguageT;
import org.atdl4j.fixatdl.core.LengthT;
import org.atdl4j.fixatdl.core.LocalMktDateT;
import org.atdl4j.fixatdl.core.MonthYearT;
import org.atdl4j.fixatdl.core.MultipleCharValueT;
import org.atdl4j.fixatdl.core.MultipleStringValueT;
import org.atdl4j.fixatdl.core.NumInGroupT;
import org.atdl4j.fixatdl.core.ParameterT;
import org.atdl4j.fixatdl.core.PercentageT;
import org.atdl4j.fixatdl.core.PriceOffsetT;
import org.atdl4j.fixatdl.core.PriceT;
import org.atdl4j.fixatdl.core.QtyT;
import org.atdl4j.fixatdl.core.SeqNumT;
import org.atdl4j.fixatdl.core.StringT;
import org.atdl4j.fixatdl.core.TZTimeOnlyT;
import org.atdl4j.fixatdl.core.TZTimestampT;
import org.atdl4j.fixatdl.core.TagNumT;
import org.atdl4j.fixatdl.core.TenorT;
import org.atdl4j.fixatdl.core.UTCDateOnlyT;
import org.atdl4j.fixatdl.core.UTCTimeOnlyT;
import org.atdl4j.fixatdl.core.UTCTimestampT;
import org.atdl4j.fixatdl.timezones.Timezone;

public class ParameterHelper
{
	public static Object getConstValue(ParameterT parameter)
	{
		if ( parameter instanceof IntT )
		{
			return ( (IntT) parameter ).getConstValue();
		}
		else if ( parameter instanceof LengthT )
		{
			return ( (LengthT) parameter ).getConstValue();
		}
		else if ( parameter instanceof NumInGroupT )
		{
			return ( (NumInGroupT) parameter ).getConstValue();
		}
		else if ( parameter instanceof SeqNumT )
		{
			return ( (SeqNumT) parameter ).getConstValue();
		}
		else if ( parameter instanceof TagNumT )
		{
			return ( (TagNumT) parameter ).getConstValue();
		}
		else if ( parameter instanceof FloatT )
		{
			return ( (FloatT) parameter ).getConstValue();
		}
		else if ( parameter instanceof QtyT )
		{
			return ( (QtyT) parameter ).getConstValue();
		}
		else if ( parameter instanceof PriceT )
		{
			return ( (PriceT) parameter ).getConstValue();
		}
		else if ( parameter instanceof PriceOffsetT )
		{
			return ( (PriceOffsetT) parameter ).getConstValue();
		}
		else if ( parameter instanceof AmtT )
		{
			return ( (AmtT) parameter ).getConstValue();
		}
		else if ( parameter instanceof PercentageT )
		{
			return ( (PercentageT) parameter ).getConstValue();
		}
		else if ( parameter instanceof CharT )
		{
			return ( (CharT) parameter ).getConstValue();
		}
		else if ( parameter instanceof BooleanT )
		{
			return ( (BooleanT) parameter ).getConstValue();
		}
		else if ( parameter instanceof StringT )
		{
			return ( (StringT) parameter ).getConstValue();
		}
		else if ( parameter instanceof MultipleCharValueT )
		{
			return ( (MultipleCharValueT) parameter ).getConstValue();
		}
		else if ( parameter instanceof CurrencyT )
		{
			return ( (CurrencyT) parameter ).getConstValue();
		}
		else if ( parameter instanceof ExchangeT )
		{
			return ( (ExchangeT) parameter ).getConstValue();
		}
		else if ( parameter instanceof MonthYearT )
		{
			return ( (MonthYearT) parameter ).getConstValue();
		}
		else if ( parameter instanceof UTCTimestampT )
		{
			if ( parameter != null )
			{
				return DateTimeConverter.convertDailyValueToValue( ( (UTCTimestampT) parameter ).getConstValue(), getLocalMktTz( parameter) );
			}
		}
		else if ( parameter instanceof UTCTimeOnlyT )
		{
			return ( (UTCTimeOnlyT) parameter ).getConstValue();
		}
		else if ( parameter instanceof LocalMktDateT )
		{
			return ( (LocalMktDateT) parameter ).getConstValue();
		}
		else if ( parameter instanceof UTCDateOnlyT )
		{
			return ( (UTCDateOnlyT) parameter ).getConstValue();
		}
		else if ( parameter instanceof DataT )
		{
			return ( (DataT) parameter ).getConstValue();
		}
		else if ( parameter instanceof MultipleStringValueT )
		{
			return ( (MultipleStringValueT) parameter ).getConstValue();
		}
		else if (parameter instanceof CountryT) 
		{ 
			return ((CountryT)parameter).getConstValue(); 
		}
		else if ( parameter instanceof LanguageT )
		{
			return ( (LanguageT) parameter ).getConstValue();
		}
		else if ( parameter instanceof TZTimeOnlyT )
		{
			return ( (TZTimeOnlyT) parameter ).getConstValue();
		}
		else if ( parameter instanceof TZTimestampT )
		{
			if ( parameter != null )
			{
				return DateTimeConverter.convertDailyValueToValue( ( (TZTimestampT) parameter ).getConstValue(), null );
			}
		}
		else if ( parameter instanceof TenorT )
		{
			return ( (TenorT) parameter ).getConstValue();
		}
		return null;
	}
	
	
	public static Object getMaxValue(ParameterT parameter)
	{
		if ( parameter instanceof IntT )
		{
			return ( (IntT) parameter ).getMaxValue();
		}
		else if ( parameter instanceof LengthT )
		{
//			return ( (LengthT) parameter ).getMaxValue();
		}
		else if ( parameter instanceof NumInGroupT )
		{
//			return ( (NumInGroupT) parameter ).getMaxValue();
		}
		else if ( parameter instanceof SeqNumT )
		{
//			return ( (SeqNumT) parameter ).getMaxValue();
		}
		else if ( parameter instanceof TagNumT )
		{
//			return ( (TagNumT) parameter ).getMaxValue();
		}
		else if ( parameter instanceof FloatT )
		{
			return ( (FloatT) parameter ).getMaxValue();
		}
		else if ( parameter instanceof QtyT )
		{
			return ( (QtyT) parameter ).getMaxValue();
		}
		else if ( parameter instanceof PriceT )
		{
			return ( (PriceT) parameter ).getMaxValue();
		}
		else if ( parameter instanceof PriceOffsetT )
		{
			return ( (PriceOffsetT) parameter ).getMaxValue();
		}
		else if ( parameter instanceof AmtT )
		{
			return ( (AmtT) parameter ).getMaxValue();
		}
		else if ( parameter instanceof PercentageT )
		{
			return ( (PercentageT) parameter ).getMaxValue();
		}
		else if ( parameter instanceof CharT )
		{
//			return ( (CharT) parameter ).getMaxValue();
		}
		else if ( parameter instanceof BooleanT )
		{
//			return ( (BooleanT) parameter ).getMaxValue();
		}
		else if ( parameter instanceof StringT )
		{
//			return ( (StringT) parameter ).getMaxValue();
		}
		else if ( parameter instanceof MultipleCharValueT )
		{
//			return ( (MultipleCharValueT) parameter ).getMaxValue();
		}
		else if ( parameter instanceof CurrencyT )
		{
//			return ( (CurrencyT) parameter ).getMaxValue();
		}
		else if ( parameter instanceof ExchangeT )
		{
//			return ( (ExchangeT) parameter ).getMaxValue();
		}
		else if ( parameter instanceof MonthYearT )
		{
			return ( (MonthYearT) parameter ).getMaxValue();
		}
		else if ( parameter instanceof UTCTimestampT )
		{
			if ( parameter != null )
			{
				return DateTimeConverter.convertDailyValueToValue( ( (UTCTimestampT) parameter ).getMaxValue(), getLocalMktTz( parameter) );
			}
		}
		else if ( parameter instanceof UTCTimeOnlyT )
		{
			return ( (UTCTimeOnlyT) parameter ).getMaxValue();
		}
		else if ( parameter instanceof LocalMktDateT )
		{
			return ( (LocalMktDateT) parameter ).getMaxValue();
		}
		else if ( parameter instanceof UTCDateOnlyT )
		{
			return ( (UTCDateOnlyT) parameter ).getMaxValue();
		}
		else if ( parameter instanceof DataT )
		{
//			return ( (DataT) parameter ).getMaxValue();
		}
		else if ( parameter instanceof MultipleStringValueT )
		{
//			return ( (MultipleStringValueT) parameter ).getMaxValue();
		}
		else if (parameter instanceof CountryT) 
		{ 
//			return ( (CountryT) parameter).getMaxValue(); 
		}
		else if ( parameter instanceof LanguageT )
		{
//			return ( (LanguageT) parameter ).getMaxValue();
		}
		else if ( parameter instanceof TZTimeOnlyT )
		{
			return ( (TZTimeOnlyT) parameter ).getMaxValue();
		}
		else if ( parameter instanceof TZTimestampT )
		{
			if ( parameter != null )
			{
				return DateTimeConverter.convertDailyValueToValue( ( (TZTimestampT) parameter ).getMaxValue(), null );
			}
		}
		else if ( parameter instanceof TenorT )
		{
//			return ( (TenorT) parameter ).getMaxValue();
		}
		
		return null;
	}	
	
	
	public static Object getMinValue(ParameterT parameter)
	{
		if ( parameter instanceof IntT )
		{
			return ( (IntT) parameter ).getMinValue();
		}
		else if ( parameter instanceof LengthT )
		{
//			return ( (LengthT) parameter ).getMinValue();
		}
		else if ( parameter instanceof NumInGroupT )
		{
//			return ( (NumInGroupT) parameter ).getMinValue();
		}
		else if ( parameter instanceof SeqNumT )
		{
//			return ( (SeqNumT) parameter ).getMinValue();
		}
		else if ( parameter instanceof TagNumT )
		{
//			return ( (TagNumT) parameter ).getMinValue();
		}
		else if ( parameter instanceof FloatT )
		{
			return ( (FloatT) parameter ).getMinValue();
		}
		else if ( parameter instanceof QtyT )
		{
			return ( (QtyT) parameter ).getMinValue();
		}
		else if ( parameter instanceof PriceT )
		{
			return ( (PriceT) parameter ).getMinValue();
		}
		else if ( parameter instanceof PriceOffsetT )
		{
			return ( (PriceOffsetT) parameter ).getMinValue();
		}
		else if ( parameter instanceof AmtT )
		{
			return ( (AmtT) parameter ).getMinValue();
		}
		else if ( parameter instanceof PercentageT )
		{
			return ( (PercentageT) parameter ).getMinValue();
		}
		else if ( parameter instanceof CharT )
		{
//			return ( (CharT) parameter ).getMinValue();
		}
		else if ( parameter instanceof BooleanT )
		{
//			return ( (BooleanT) parameter ).getMinValue();
		}
		else if ( parameter instanceof StringT )
		{
//			return ( (StringT) parameter ).getMinValue();
		}
		else if ( parameter instanceof MultipleCharValueT )
		{
//			return ( (MultipleCharValueT) parameter ).getMinValue();
		}
		else if ( parameter instanceof CurrencyT )
		{
//			return ( (CurrencyT) parameter ).getMinValue();
		}
		else if ( parameter instanceof ExchangeT )
		{
//			return ( (ExchangeT) parameter ).getMinValue();
		}
		else if ( parameter instanceof MonthYearT )
		{
			return ( (MonthYearT) parameter ).getMinValue();
		}
		else if ( parameter instanceof UTCTimestampT )
		{
			if ( parameter != null )
			{
				return DateTimeConverter.convertDailyValueToValue( ( (UTCTimestampT) parameter ).getMinValue(), getLocalMktTz( parameter) );
			}
		}
		else if ( parameter instanceof UTCTimeOnlyT )
		{
			return ( (UTCTimeOnlyT) parameter ).getMinValue();
		}
		else if ( parameter instanceof LocalMktDateT )
		{
			return ( (LocalMktDateT) parameter ).getMinValue();
		}
		else if ( parameter instanceof UTCDateOnlyT )
		{
			return ( (UTCDateOnlyT) parameter ).getMinValue();
		}
		else if ( parameter instanceof DataT )
		{
//			return ( (DataT) parameter ).getMinValue();
		}
		else if ( parameter instanceof MultipleStringValueT )
		{
//			return ( (MultipleStringValueT) parameter ).getMinValue();
		}
		else if (parameter instanceof CountryT) 
		{ 
//			return ( (CountryT) parameter).getMinValue(); 
		}
		else if ( parameter instanceof LanguageT )
		{
//			return ( (LanguageT) parameter ).getMinValue();
		}
		else if ( parameter instanceof TZTimeOnlyT )
		{
			return ( (TZTimeOnlyT) parameter ).getMinValue();
		}
		else if ( parameter instanceof TZTimestampT )
		{
			if ( parameter != null )
			{
				return DateTimeConverter.convertDailyValueToValue( ( (TZTimestampT) parameter ).getMinValue(), null );
			}
		}
		else if ( parameter instanceof TenorT )
		{
//			return ( (TenorT) parameter ).getMinValue();
		}
		
		return null;
	}	
	
	public static Timezone getLocalMktTz( ParameterT parameter )
	{
		if ( parameter instanceof UTCTimestampT )
		{
			return ( (UTCTimestampT) parameter ).getLocalMktTz();
		}
		else if ( parameter instanceof UTCTimeOnlyT )
		{
			return ( (UTCTimeOnlyT) parameter ).getLocalMktTz();
		}
		
		return null;
	}
	
	
	public static BigInteger getMaxLength(ParameterT parameter)
	{
		if ( parameter instanceof IntT )
		{
//			return ( (IntT) parameter ).getMaxLength();
		}
		else if ( parameter instanceof LengthT )
		{
//			return ( (LengthT) parameter ).getMaxLength();
		}
		else if ( parameter instanceof NumInGroupT )
		{
//			return ( (NumInGroupT) parameter ).getMaxLength();
		}
		else if ( parameter instanceof SeqNumT )
		{
//			return ( (SeqNumT) parameter ).getMaxLength();
		}
		else if ( parameter instanceof TagNumT )
		{
//			return ( (TagNumT) parameter ).getMaxLength();
		}
		else if ( parameter instanceof FloatT )
		{
//			return ( (FloatT) parameter ).getMaxLength();
		}
		else if ( parameter instanceof QtyT )
		{
//			return ( (QtyT) parameter ).getMaxLength();
		}
		else if ( parameter instanceof PriceT )
		{
//			return ( (PriceT) parameter ).getMaxLength();
		}
		else if ( parameter instanceof PriceOffsetT )
		{
//			return ( (PriceOffsetT) parameter ).getMaxLength();
		}
		else if ( parameter instanceof AmtT )
		{
//			return ( (AmtT) parameter ).getMaxLength();
		}
		else if ( parameter instanceof PercentageT )
		{
//			return ( (PercentageT) parameter ).getMaxLength();
		}
		else if ( parameter instanceof CharT )
		{
//			return ( (CharT) parameter ).getMaxLength();
		}
		else if ( parameter instanceof BooleanT )
		{
//			return ( (BooleanT) parameter ).getMaxLength();
		}
		else if ( parameter instanceof StringT )
		{
			return ( (StringT) parameter ).getMaxLength();
		}
		else if ( parameter instanceof MultipleCharValueT )
		{
			return ( (MultipleCharValueT) parameter ).getMaxLength();
		}
		else if ( parameter instanceof CurrencyT )
		{
//			return ( (CurrencyT) parameter ).getMaxLength();
		}
		else if ( parameter instanceof ExchangeT )
		{
//			return ( (ExchangeT) parameter ).getMaxLength();
		}
		else if ( parameter instanceof MonthYearT )
		{
//			return ( (MonthYearT) parameter ).getMaxLength();
		}
		else if ( parameter instanceof UTCTimestampT )
		{
//			return ( (UTCTimestampT) parameter ).getMaxLength();
		}
		else if ( parameter instanceof UTCTimeOnlyT )
		{
//			return ( (UTCTimeOnlyT) parameter ).getMaxLength();
		}
		else if ( parameter instanceof LocalMktDateT )
		{
//			return ( (LocalMktDateT) parameter ).getMaxLength();
		}
		else if ( parameter instanceof UTCDateOnlyT )
		{
//			return ( (UTCDateOnlyT) parameter ).getMaxLength();
		}
		else if ( parameter instanceof DataT )
		{
			return ( (DataT) parameter ).getMaxLength();
		}
		else if ( parameter instanceof MultipleStringValueT )
		{
			return ( (MultipleStringValueT) parameter ).getMaxLength();
		}
		else if (parameter instanceof CountryT) 
		{ 
//			return ( (CountryT) parameter).getMaxLength(); 
		}
		else if ( parameter instanceof LanguageT )
		{
//			return ( (LanguageT) parameter ).getMaxLength();
		}
		else if ( parameter instanceof TZTimeOnlyT )
		{
//			return ( (TZTimeOnlyT) parameter ).getMaxLength();
		}
		else if ( parameter instanceof TZTimestampT )
		{
//			return ( (TZTimestampT) parameter ).getMaxLength();
		}
		else if ( parameter instanceof TenorT )
		{
//			return ( (TenorT) parameter ).getMaxLength();
		}
		
		return null;
	}	
	
	
	public static BigInteger getMinLength(ParameterT parameter)
	{
		if ( parameter instanceof IntT )
		{
//			return ( (IntT) parameter ).getMinLength();
		}
		else if ( parameter instanceof LengthT )
		{
//			return ( (LengthT) parameter ).getMinLength();
		}
		else if ( parameter instanceof NumInGroupT )
		{
//			return ( (NumInGroupT) parameter ).getMinLength();
		}
		else if ( parameter instanceof SeqNumT )
		{
//			return ( (SeqNumT) parameter ).getMinLength();
		}
		else if ( parameter instanceof TagNumT )
		{
//			return ( (TagNumT) parameter ).getMinLength();
		}
		else if ( parameter instanceof FloatT )
		{
//			return ( (FloatT) parameter ).getMinLength();
		}
		else if ( parameter instanceof QtyT )
		{
//			return ( (QtyT) parameter ).getMinLength();
		}
		else if ( parameter instanceof PriceT )
		{
//			return ( (PriceT) parameter ).getMinLength();
		}
		else if ( parameter instanceof PriceOffsetT )
		{
//			return ( (PriceOffsetT) parameter ).getMinLength();
		}
		else if ( parameter instanceof AmtT )
		{
//			return ( (AmtT) parameter ).getMinLength();
		}
		else if ( parameter instanceof PercentageT )
		{
//			return ( (PercentageT) parameter ).getMinLength();
		}
		else if ( parameter instanceof CharT )
		{
//			return ( (CharT) parameter ).getMinLength();
		}
		else if ( parameter instanceof BooleanT )
		{
//			return ( (BooleanT) parameter ).getMinLength();
		}
		else if ( parameter instanceof StringT )
		{
			return ( (StringT) parameter ).getMinLength();
		}
		else if ( parameter instanceof MultipleCharValueT )
		{
			return ( (MultipleCharValueT) parameter ).getMinLength();
		}
		else if ( parameter instanceof CurrencyT )
		{
//			return ( (CurrencyT) parameter ).getMinLength();
		}
		else if ( parameter instanceof ExchangeT )
		{
//			return ( (ExchangeT) parameter ).getMinLength();
		}
		else if ( parameter instanceof MonthYearT )
		{
//			return ( (MonthYearT) parameter ).getMinLength();
		}
		else if ( parameter instanceof UTCTimestampT )
		{
//			return ( (UTCTimestampT) parameter ).getMinLength();
		}
		else if ( parameter instanceof UTCTimeOnlyT )
		{
//			return ( (UTCTimeOnlyT) parameter ).getMinLength();
		}
		else if ( parameter instanceof LocalMktDateT )
		{
//			return ( (LocalMktDateT) parameter ).getMinLength();
		}
		else if ( parameter instanceof UTCDateOnlyT )
		{
//			return ( (UTCDateOnlyT) parameter ).getMinLength();
		}
		else if ( parameter instanceof DataT )
		{
			return ( (DataT) parameter ).getMinLength();
		}
		else if ( parameter instanceof MultipleStringValueT )
		{
			return ( (MultipleStringValueT) parameter ).getMinLength();
		}
		else if (parameter instanceof CountryT) 
		{ 
//			return ( (CountryT) parameter).getMinLength(); 
		}
		else if ( parameter instanceof LanguageT )
		{
//			return ( (LanguageT) parameter ).getMinLength();
		}
		else if ( parameter instanceof TZTimeOnlyT )
		{
//			return ( (TZTimeOnlyT) parameter ).getMinLength();
		}
		else if ( parameter instanceof TZTimestampT )
		{
//			return ( (TZTimestampT) parameter ).getMinLength();
		}
		else if ( parameter instanceof TenorT )
		{
//			return ( (TenorT) parameter ).getMinLength();
		}
		
		return null;
	}	
	
	public static EnumPairT getEnumPairForEnumID( ParameterT aParameter, String aEnumID)
	{
		for ( EnumPairT enumPair : aParameter.getEnumPair() )
		{
			if ( enumPair.getEnumID().equals( aEnumID ) )
			{
				return enumPair;
			}
		}
		
		return null;
	}
	
	public static EnumPairT getEnumPairForWireValue( ParameterT aParameter, String aWireValue)
	{
		for ( EnumPairT enumPair : aParameter.getEnumPair() )
		{
			if ( enumPair.getWireValue().equals( aWireValue ) )
			{
				return enumPair;
			}
		}
		
		return null;
	}
	
	public static String getWireValueForEnumID( ParameterT aParameter, String aEnumID )
	{
		EnumPairT tempEnumPair = getEnumPairForEnumID( aParameter, aEnumID );
		if ( tempEnumPair != null )
		{
			if ( Atdl4jConstants.VALUE_NULL_INDICATOR.equals( tempEnumPair.getWireValue() ) )
			{
				return null;
			}
			else
			{
				return tempEnumPair.getWireValue();
			}
		}
		else
		{
			return null;
		}
	}
}
