package frame.data.convert;

import java.math.BigDecimal;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import frame.data.Variant;


public class IntegerTranslator extends Convertor {

	
	public Object loadToObject(String value) throws Exception {
		return Integer.valueOf(value);
	}

	public Variant loadToVariant(String value) throws Exception {
		if (value == null) {
			return new Variant();
		}
		
		Integer result = Integer.valueOf(value);
		
		return new Variant(result);
	}
	
	public String toString(Object value) throws Exception {
		if (value == null) {
			return null;
		}
		
		return value.toString();
	}
	
	public String toSqlString(Object value) throws Exception {
		if (value == null) {
			return null;
		}
		
		return String.valueOf(value);
	}
	
	public String toSqlString(String prefix, Object value, String suffix) throws Exception	{
		return toSqlString(value);
	}

	public String toJSONString(Object value) throws Exception {
		if (value == null) {
			return "null";
		}
		
		return value.toString();
	}

	@Override
	public Integer toInteger(Object object) throws Exception {
		if (object == null) {
			return 0;
		}
		
		return (Integer)object;
	}

	@Override
	public Double toDouble(Object object) throws Exception {
		if (object == null) {
			return 0.0;
		}
		
		return Double.valueOf((Integer)object);
	}

	@Override
	public BigDecimal toBigDecimal(Object object) throws Exception {
		if (object == null) {
			return BigDecimal.valueOf(0);
		}
		
		return BigDecimal.valueOf((Integer)object);
	}
	
	@Override
	public Boolean toBoolean(Object object) throws Exception {
		Integer value = toInteger(object);
		return value != 0;
	}

	@Override
	public Date toDate(Object object) throws Exception {
		Integer value = toInteger(object);
		
		if (value >= 19500101 && value <= 21000101) {
			String String = String.valueOf(value);
			DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
			return dateFormat.parse(String);
		}
		else if (value > (1950 - 1900) * 365 && value < (2100 - 1900) * 365) {
			Calendar calendar = Calendar.getInstance();
			calendar.set(Calendar.YEAR, 1900);
			calendar.set(Calendar.MONTH, 0);
			calendar.set(Calendar.DAY_OF_MONTH, 1);
			calendar.set(Calendar.HOUR_OF_DAY, 0);
			calendar.set(Calendar.MINUTE, 0);
			calendar.set(Calendar.SECOND, 0);
			calendar.add(Calendar.DATE, value - 2);
			
			return calendar.getTime();
		}
		
		return null;
	}

	@Override
	public Object toSelfType(Object value) throws Exception {
		return toInteger(value);
	}

}