package tableDefinition;

import java.util.Calendar;

public class ColumnElement
{
    private int columnNumber;
    private String originalColumnName;
    private String columnName;
    private String dataType;
    private int dataLength;
    private int scale;
    private boolean nullable;
    private String postgresDataType;      // Assumes Postgres for now - why would I use any other database?
    private boolean precisionIsNull;
    private boolean scaleIsNull;
    
    
    
	public ColumnElement()
	{
		;
	}

	public int getColumnNumber()
	{
		return columnNumber;
	}

	public void setColumnNumber(int columnId)
	{
		this.columnNumber = columnId;
	}

	public String getOriginalColumnName()
	{
		return originalColumnName;
	}

	public String getColumnName()
	{
		return columnName;
	}

	public void setColumnName(String columnName)
	{
		StandardiseName standardiseName;
		
		this.originalColumnName = columnName;
		standardiseName = new StandardiseName();
		
		this.columnName = standardiseName.get(columnName);
	}

	public int getDataLength()
	{
		return dataLength;
	}

	public void setDataLength(int dataLength)
	{
		this.dataLength = dataLength;
	}

	public int getScale()
	{
		return scale;
	}

	public void setScale(int scale)
	{
		this.scale = scale;
	}

	public String getDataType()
	{
		return dataType;
	}

	public void setDataType(String dataType)
	{
		this.dataType = dataType;
        if 
        (
   			dataType.equalsIgnoreCase("NUMBER") ||
			dataType.equalsIgnoreCase("DEC") || 
			dataType.equalsIgnoreCase("DECIMAL") || 
			dataType.equalsIgnoreCase("NUMERIC")
        )
        	postgresDataType = "numeric";
        else if 
        (
			dataType.equalsIgnoreCase("DOUBLE PRECISION") ||
			dataType.equalsIgnoreCase("DOUBLE") ||
			dataType.equalsIgnoreCase("FLOAT8")  
       )
        	postgresDataType = "double precision";
        else if 
        (
			dataType.equalsIgnoreCase("FLOAT") || 
			dataType.equalsIgnoreCase("FLOAT4") || 
			dataType.equalsIgnoreCase("REAL")
        )
        	postgresDataType = "real";
        else if 
        (
			dataType.equalsIgnoreCase("INT8") || 
			dataType.equalsIgnoreCase("BIGINT")
        )
        	postgresDataType = "bigint";
        else if 
        (
			dataType.equalsIgnoreCase("BINARY_INTEGER") || 
			dataType.equalsIgnoreCase("NATURAL") ||
			dataType.equalsIgnoreCase("NATURALN") || 
			dataType.equalsIgnoreCase("POSITIVE") || 
			dataType.equalsIgnoreCase("POSITIVEN") || 
			dataType.equalsIgnoreCase("SIGNTYPE") || 
			dataType.equalsIgnoreCase("INTEGER") || 
			dataType.equalsIgnoreCase("INT") || 
			dataType.equalsIgnoreCase("INT1") || 
			dataType.equalsIgnoreCase("INT2") || 
			dataType.equalsIgnoreCase("INT4") || 
			dataType.equalsIgnoreCase("SMALLINT")
        )
        	postgresDataType = "integer";
        else if 
        (
    		(dataType.equalsIgnoreCase("DATE"))
        )
        	postgresDataType = "Date";
        else if 
        (
     		(dataType.toLowerCase().startsWith("timestamp")) ||
     		(dataType.toLowerCase().startsWith("datetime"))
        )
        	postgresDataType = "timestamp";
        else if 
        (
     		(dataType.equalsIgnoreCase("TIME"))
        )
        	postgresDataType = "time";
        else if 
        (
    		(dataType.equalsIgnoreCase("TIMETZ"))
        )
        	postgresDataType = "time with time zone";
        else if 
        (
        	(dataType.toLowerCase().startsWith("bool")) ||
        	(dataType.toLowerCase().equals("bit"))
        )
        	postgresDataType = "boolean";
        else if 
        (
			dataType.equalsIgnoreCase("CHAR") || 
			dataType.equalsIgnoreCase("NCHAR") ||
			dataType.equalsIgnoreCase("NVARCHAR") || 
			dataType.equalsIgnoreCase("VARCHAR") ||
			dataType.equalsIgnoreCase("VARBINARY")
        )
        	postgresDataType = "varchar";
        else
        	System.out.println("Data-type " + dataType + "is not supported.");
	}

	public String getPostgresDataType()
	{
		return postgresDataType;
	}

	public boolean getNullable()
	{
		return nullable;
	}

	public void setNullable(boolean nullable)
	{
		this.nullable = nullable;
	}

	public String getProfileDataType()
	{
		return postgresDataType;
	}

	public boolean isPrecisionIsNull() 
	{
		return precisionIsNull;
	}

	public void setPrecisionIsNull(boolean precisionIsNull) 
	{
		this.precisionIsNull = precisionIsNull;
	}

	public boolean isScaleIsNull() 
	{
		return scaleIsNull;
	}

	public void setScaleIsNull(boolean scaleIsNull) 
	{
		this.scaleIsNull = scaleIsNull;
	}

	public void setOriginalColumnName(String originalColumnName) 
	{
		this.originalColumnName = originalColumnName;
	}

	public void setPostgresDataType(String postgresDataType) 
	{
		this.postgresDataType = postgresDataType;
	}
}
