package org.jivesoftware.openfire.plugin.rest.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.ws.rs.core.Response;

import org.jivesoftware.database.DbConnectionManager;
import org.jivesoftware.openfire.plugin.rest.exceptions.ExceptionType;
import org.jivesoftware.openfire.plugin.rest.exceptions.ServiceException;

/**
 * The Class PropertyDAO.
 */
public class PropertyDAO {

	/** The Constant LOAD_PROPERTY. */
	private final static String LOAD_PROPERTY = "SELECT username FROM ofUserProp WHERE name=? AND propValue=?";

	/** The Constant LOAD_PROPERTY_BY_KEY. */
	private final static String LOAD_PROPERTY_BY_KEY = "SELECT username FROM ofUserProp WHERE name=?";

	/**
	 * Gets the username by property key and or value.
	 *
	 * @param propertyName
	 *            the property name
	 * @param propertyValue
	 *            the property value (can be null)
	 * @return the username by property
	 * @throws ServiceException
	 *             the service exception
	 */
	public static List<String> getUsernameByProperty(String propertyName, String propertyValue) throws ServiceException {
		List<String> usernames = new ArrayList<String>();
		Connection con = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		try {
			con = DbConnectionManager.getConnection();
			// Load property by key and value
			if (propertyValue != null) {
				pstmt = con.prepareStatement(LOAD_PROPERTY);
				pstmt.setString(1, propertyName);
				pstmt.setString(2, propertyValue);
			} else {
				// Load property by key
				pstmt = con.prepareStatement(LOAD_PROPERTY_BY_KEY);
				pstmt.setString(1, propertyName);
			}
			rs = pstmt.executeQuery();
			while (rs.next()) {
				usernames.add(rs.getString(1));
			}
		} catch (SQLException sqle) {
			throw new ServiceException("Could not get username by property", propertyName,
					ExceptionType.PROPERTY_NOT_FOUND, Response.Status.NOT_FOUND, sqle);
		} finally {
			DbConnectionManager.closeConnection(rs, pstmt, con);
		}
		return usernames;
	}
}
