package eu.dnetlib.dlms.jdbc;

import java.net.URL;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Calendar;

import eu.dnetlib.dlms.jdbc.server.ParamInfo;
import eu.dnetlib.dlms.lowlevel.objects.DorotyObjectEnum;
import eu.dnetlib.dlms.lowlevel.objects.structures.BooleanBasicValue;
import eu.dnetlib.dlms.lowlevel.objects.structures.DateBasicValue;
import eu.dnetlib.dlms.lowlevel.objects.structures.DoubleBasicValue;
import eu.dnetlib.dlms.lowlevel.objects.structures.IntBasicValue;
import eu.dnetlib.dlms.lowlevel.objects.structures.StringBasicValue;

/**
 * Class that provides support for named parameters in DOLPreparedStatement. TODO: this class is not currently used,
 * should we delete it or do we need it?
 * 
 * @author alessia
 * 
 */
public class ExtendedPreparedStatement extends DOLPreparedStatement {
	/**
	 * Constructor.
	 * 
	 * @param connection
	 *            a DorotyConnection
	 * @param query
	 *            DOl string to execute
	 * @throws SQLException
	 *             creating the statement
	 */
	public ExtendedPreparedStatement(final DorotyConnection connection, final String query) throws SQLException {
		super(connection, query);
		setDolString(query);
		setResultSetFactory(connection.getResultSetFactory());
	}

	/**
	 * Sets a parameter.
	 * 
	 * @param name
	 *            parameter name
	 * @param value
	 *            parameter value
	 * @throws SQLException
	 *             if an error occurred
	 * @see PreparedStatement#setBoolean(int, boolean)
	 */
	public void setBoolean(final String name, final boolean value) throws SQLException {
		setObjectBase(new BooleanBasicValue(value), DorotyObjectEnum.d_boolean, name);
	}

	/**
	 * Sets a parameter.
	 * 
	 * @param name
	 *            parameter name
	 * @param x
	 *            parameter value
	 * @throws SQLException
	 *             if an error occurred
	 */
	public void setDate(final String name, final Date x) throws SQLException {
		setObjectBase(new DateBasicValue(x), DorotyObjectEnum.d_date, name);
	}

	/**
	 * Sets a parameter.
	 * 
	 * @param name
	 *            parameter name
	 * @param x
	 *            parameter value
	 * @param cal
	 *            Calendar
	 * @throws SQLException
	 *             if an error occurred
	 */
	public void setDate(final String name, final Date x, final Calendar cal) throws SQLException {
		// TODO: what to do with the calendar??
		setObjectBase(new DateBasicValue(x), DorotyObjectEnum.d_date, name);
	}

	/**
	 * Sets a parameter.
	 * 
	 * @param name
	 *            parameter name
	 * @param x
	 *            parameter value
	 * @throws SQLException
	 *             if an error occurred
	 */
	public void setDouble(final String name, final double x) throws SQLException {
		setObjectBase(new DoubleBasicValue(x), DorotyObjectEnum.d_double, name);
	}

	/**
	 * Sets a parameter.
	 * 
	 * @param name
	 *            parameter name
	 * @param x
	 *            parameter value
	 * @throws SQLException
	 *             if an error occurred
	 */
	public void setInt(final String name, final int x) throws SQLException {
		setObjectBase(new IntBasicValue(x), DorotyObjectEnum.d_int, name);
	}

	/**
	 * Sets a parameter.
	 * 
	 * @param name
	 *            parameter name
	 * @param x
	 *            parameter value
	 * @throws SQLException
	 *             if an error occurred
	 */
	public void setLong(final String name, final long x) throws SQLException {
		setObjectBase(x, DorotyObjectEnum.std_long, name);
	}

	/**
	 * Sets a parameter.
	 * 
	 * @param name
	 *            parameter name
	 * @param x
	 *            parameter value
	 * @param targetType
	 *            type of the parameter. See also DorotyObjectEnum.
	 * @throws SQLException
	 *             if an error occurred
	 */
	public void setObject(final String name, final Object x, final int targetType) throws SQLException {
		setObjectBase(x, DorotyObjectEnum.getEnumFromCode(targetType), name);
	}

	/**
	 * Sets a parameter.
	 * 
	 * @param name
	 *            parameter name
	 * @param x
	 *            parameter value
	 * @throws SQLException
	 *             if an error occurred
	 */
	public void setString(final String name, final String x) throws SQLException {
		setObjectBase(new StringBasicValue(x), DorotyObjectEnum.d_string, name);
	}

	/**
	 * Sets a parameter.
	 * 
	 * @param name
	 *            parameter name
	 * @param x
	 *            parameter value
	 * @throws SQLException
	 *             if an error occurred
	 */
	public void setURL(final String name, final URL x) throws SQLException {
		setObjectBase(x, DorotyObjectEnum.std_url, name);

	}

	/**
	 * 
	 * {@inheritDoc}
	 * 
	 * @see eu.dnetlib.dlms.jdbc.DOLPreparedStatement#setObjectBase(java.lang.Object,
	 *      eu.dnetlib.dlms.lowlevel.objects.DorotyObjectEnum, java.lang.String)
	 */
	@Override
	void setObjectBase(final Object x, final DorotyObjectEnum dorotyType, final String parameterName) throws SQLException {
		ParamInfo paramInfo = createParamInfo(x, dorotyType, parameterName);
		getParameters().put(parameterName, paramInfo);
	}

}
