/*******************************************************************************
 * Copyright (c) 2013 Oracle. All rights reserved.
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License 2.0, which accompanies this distribution
 * and is available at https://www.eclipse.org/legal/epl-2.0/.
 * 
 * Contributors:
 *     Oracle - initial API and implementation
 ******************************************************************************/

package org.eclipse.jpt.jpa.annotate.mapping;

import java.text.NumberFormat;
import java.text.ParseException;
import org.eclipse.jpt.common.utility.internal.StringTools;
import org.eclipse.jpt.jpa.annotate.internal.plugin.JptJpaAnnotatePlugin;

public class ColumnAttributes extends AnnotationAttributes
{	
	public ColumnAttributes()
	{
		super();
	}
	
	public ColumnAttributes(ColumnAttributes another)
	{
		super(another);
	}
	
	public void setName(String name)
	{
		AnnotationAttribute attr = new AnnotationAttribute(
				AnnotationAttributeNames.NAME, name);
		setAnnotationAttribute(attr);
	}
	
	public String getName()
	{
		String name = null;
		AnnotationAttribute attr = getAnnotationAttribute(AnnotationAttributeNames.NAME);
		if (attr != null)
			name = attr.attrValue;
		return name;
	}
	
	public void setReferencedColumnName(String referencedColumnName)
	{
		AnnotationAttribute attr = new AnnotationAttribute(
				AnnotationAttributeNames.REFERENCED_COLUMN_NAME, 
				referencedColumnName);
		setAnnotationAttribute(attr);		
	}
	
	public String getReferencedColumnName()
	{
		String refColName = null;
		AnnotationAttribute attr = getAnnotationAttribute(AnnotationAttributeNames.REFERENCED_COLUMN_NAME);
		if (attr != null)
			refColName = attr.attrValue;
		return refColName;
	}
	
	public void setUnique(boolean unique)
	{
		AnnotationAttribute attr = new AnnotationAttribute(
				AnnotationAttributeNames.UNIQUE, 
				unique ? "true" : "false");
		setAnnotationAttribute(attr);		
	}
	
	public boolean isSetUnique()
	{
		return getAnnotationAttribute(AnnotationAttributeNames.UNIQUE) != null;
	}
	
	public boolean isUnique()
	{
		boolean isUnique = false;
		AnnotationAttribute attr = getAnnotationAttribute(AnnotationAttributeNames.UNIQUE);
		if (attr != null)
		{
			isUnique = attr.attrValue.equals("true") ? true : false;
		}
		return isUnique;
	}
	
	public void setNullable(boolean nullable)
	{
		AnnotationAttribute attr = new AnnotationAttribute(
				AnnotationAttributeNames.NULLABLE, 
				nullable ? "true" : "false");
		setAnnotationAttribute(attr);		
	}
	
	public boolean isSetNullable()
	{
		return getAnnotationAttribute(AnnotationAttributeNames.NULLABLE) != null;
	}
	
	public boolean isNullable()
	{
		boolean isNullable = false;
		AnnotationAttribute attr = getAnnotationAttribute(AnnotationAttributeNames.NULLABLE);
		if (attr != null)
		{
			isNullable = attr.attrValue.equals("true") ? true : false;
		}
		return isNullable;
	}
	
	public void setInsertable(boolean insertable)
	{
		AnnotationAttribute attr = new AnnotationAttribute(
				AnnotationAttributeNames.INSERTABLE, 
				insertable ? "true" : "false");
		setAnnotationAttribute(attr);		
	}

	public boolean isSetInsertable()
	{
		return getAnnotationAttribute(AnnotationAttributeNames.INSERTABLE) != null;	
	}
	
	public boolean isInsertable()
	{
		boolean isInsertable = false;
		AnnotationAttribute attr = getAnnotationAttribute(AnnotationAttributeNames.INSERTABLE);
		if (attr != null)
		{
			isInsertable = attr.attrValue.equals("true") ? true : false;
		}
		return isInsertable;
	}

	public void setUpdatable(boolean updatable)
	{
		AnnotationAttribute attr = new AnnotationAttribute(
				AnnotationAttributeNames.UPDATABLE, 
				updatable ? "true" : "false");
		setAnnotationAttribute(attr);		
	}

	public boolean isSetUpdatable()
	{
		return getAnnotationAttribute(AnnotationAttributeNames.UPDATABLE) != null;
	}
	
	public boolean isUpdatable()
	{
		boolean isUpdatable = false;
		AnnotationAttribute attr = getAnnotationAttribute(AnnotationAttributeNames.UPDATABLE);
		if (attr != null)
		{
			isUpdatable = attr.attrValue.equals("true") ? true : false;
		}
		return isUpdatable;
	}
	
	public void setColumnDefinition(String columnDefinition)
	{
		AnnotationAttribute attr = new AnnotationAttribute(
				AnnotationAttributeNames.COLUMN_DEFINITION, 
				columnDefinition);
		setAnnotationAttribute(attr);		
	}
	
	public String getColumnDefinition()
	{
		String colDef = null;
		AnnotationAttribute attr = getAnnotationAttribute(AnnotationAttributeNames.COLUMN_DEFINITION);
		if (attr != null)
			colDef = attr.attrValue;
		return colDef;
	}
	
	public void setTable(String table)
	{
		AnnotationAttribute attr = new AnnotationAttribute(
				AnnotationAttributeNames.TABLE, table);
		setAnnotationAttribute(attr);
	}
	
	public String getTable()
	{
		String table = null;
		AnnotationAttribute attr = getAnnotationAttribute(AnnotationAttributeNames.TABLE);
		if (attr != null)
			table = attr.attrValue;
		return table;
	}

	public void setLength(int length)
	{
		AnnotationAttribute attr = new AnnotationAttribute(
				AnnotationAttributeNames.LENGTH, 
				String.valueOf(length));
		setAnnotationAttribute(attr);		
	}
	
	public void setLength(String lengthStr)
	{
		AnnotationAttribute attr = new AnnotationAttribute(
				AnnotationAttributeNames.LENGTH, 
				lengthStr);
		setAnnotationAttribute(attr);
	}

	public boolean isSetLength()
	{
		AnnotationAttribute attr = getAnnotationAttribute(AnnotationAttributeNames.LENGTH);
		return attr != null && !StringTools.isBlank(attr.attrValue);
	}
	
	public int getLength()
	{
		int length = 0;
		AnnotationAttribute attr = getAnnotationAttribute(AnnotationAttributeNames.LENGTH);
		if (attr != null)
		{
			try 
			{
				Number number = NumberFormat.getNumberInstance().parse(attr.attrValue);
				length = number.intValue();
			}
			catch (ParseException pe)
			{
				JptJpaAnnotatePlugin.instance().logError(pe);
			}
		}
		return length;
	}

	public void setPrecision(int precision)
	{
		AnnotationAttribute attr = new AnnotationAttribute(
				AnnotationAttributeNames.PRECISION, 
				String.valueOf(precision));
		setAnnotationAttribute(attr);		
	}

	public void setPrecision(String precisionStr)
	{
		AnnotationAttribute attr = new AnnotationAttribute(
				AnnotationAttributeNames.PRECISION, 
				precisionStr);
		setAnnotationAttribute(attr);
	}

	public boolean isSetPrecision()
	{
		AnnotationAttribute attr = getAnnotationAttribute(AnnotationAttributeNames.PRECISION);
		return attr != null && !StringTools.isBlank(attr.attrValue);
	}
	
	public int getPrecision()
	{
		int precision = 0;
		AnnotationAttribute attr = getAnnotationAttribute(AnnotationAttributeNames.PRECISION);
		if (attr != null)
		{
			try 
			{
				Number number = NumberFormat.getNumberInstance().parse(attr.attrValue);
				precision = number.intValue();
			}
			catch (ParseException pe)
			{
				JptJpaAnnotatePlugin.instance().logError(pe);
			}
		}
		return precision;
	}

	public void setScale(int scale)
	{
		AnnotationAttribute attr = new AnnotationAttribute(
				AnnotationAttributeNames.SCALE, 
				String.valueOf(scale));
		setAnnotationAttribute(attr);				
	}

	public void setScale(String scaleStr)
	{
		AnnotationAttribute attr = new AnnotationAttribute(
				AnnotationAttributeNames.SCALE, 
				scaleStr);
		setAnnotationAttribute(attr);
	}
	
	public boolean isSetScale()
	{
		AnnotationAttribute attr = getAnnotationAttribute(AnnotationAttributeNames.SCALE);
		return attr != null && !StringTools.isBlank(attr.attrValue);
	}
	
	public int getScale()
	{
		int scale = 0;
		AnnotationAttribute attr = getAnnotationAttribute(AnnotationAttributeNames.SCALE);
		if (attr != null)
		{
			try 
			{
				Number number = NumberFormat.getNumberInstance().parse(attr.attrValue);
				scale = number.intValue();
			}
			catch (ParseException pe)
			{
				JptJpaAnnotatePlugin.instance().logError(pe);
			}
		}
		return scale;
	}	
}
