package frame.variant.translator;

import java.math.BigDecimal;
import java.util.Date;

import frame.variant.Value;

public abstract class ITranslator {

	protected String format;
	
	public ITranslator() {
		
	}
	
	public abstract String toString(Object value) throws Exception;
	
	public String toString(Object value, String defaultValue) {
		try {
			return toString(value);
		}
		catch (Exception e) {
			return defaultValue;
		}
	}
	
	public abstract String toSqlString(Object value) throws Exception;
	
	public String toSqlString(String prefix, Object value, String suffix) throws Exception	{
		if (value == null) {
			return "null";
		}
		
		String result = toSqlString(value);
		
		if (prefix != null) {
			result = result + prefix;
		}
		
		if (suffix != null) {
			result = result + suffix;
		}
		
		return "'" + result + "'";
	}

	public abstract String toJSONString(Object value) throws Exception;
	
	public abstract String toSchemaString(Object value) throws Exception;
	
	public abstract Integer toInteger(Object value) throws Exception;

	public Integer toInteger(Object value, Integer defaultValue) {
		if (value == null) {
			return defaultValue;
		}
		
		try {
			return toInteger(value);
		}
		catch (Exception e) {
			return defaultValue;
		}
	}
	
	public abstract Double toDouble(Object value)throws Exception;
	
	public Double toDouble(Object value, Double defaultValue) {
		if (value == null) {
			return defaultValue;
		}
		
		try {
			return toDouble(value);
		}
		catch (Exception e) {
			return defaultValue;
		}
	}
	
	public abstract BigDecimal toBigDecimal(Object value) throws Exception;

	public BigDecimal toBigDecimal(Object value, BigDecimal defaultValue) {
		try {
			return toBigDecimal(value);
		}
		catch (Exception e) {
			return defaultValue;
		}
	}
	
	public abstract Boolean toBoolean(Object value) throws Exception;
	
	public Boolean toBoolean(Object value, boolean defaultValue) {
		try {
			return toBoolean(value);
		}
		catch (Exception e) {
			return defaultValue;
		}
	}

	public abstract Date toDate(Object value) throws Exception;
	
	public Date toDate(Object value, Date defaultValue) {
		try {
			return toDate(value);
		}
		catch (Exception e) {
			return defaultValue;
		}
	}

	public abstract Object toTranslatorTypeValue(Object value) throws Exception;;
	
	public abstract Object loadObjectFrom(String value) throws Exception;
	
	public Object loadObjectFrom(String value, Object defaultValue) {
		try {
			return loadObjectFrom(value);
		}
		catch (Exception e) {
			return defaultValue;
		}
	}
	
	public abstract Value loadVariantFrom(String value) throws Exception;
	
	public abstract Value loadVariantFrom(String value, Object defaultValue);
	
	public abstract Class<?> getDataClass();
	
	public void setFormat(String format) {
		this.format = format;
	}
	
	public String getFormat() {
		return format;
	}

}