package ajax;

import java.io.IOException;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import ajax.database.PendingMessageBean;
import ajax.database.User;
import ajax.database.UserBean;

/**
 * Message control servlet
 *
 * @author Adam J. Kaplan
 */
public class Communicate extends HttpServlet 
{
	private static final long serialVersionUID = 1L;

	/**
	* Get method handler for servlet functionality.
	* 
	* @param request The HTTP request to the servlet
	* @param response The HTTP response to the client
	*/
	public void doGet(HttpServletRequest request, HttpServletResponse response)
		throws ServletException, IOException
	{
		dispatchRequest(request, response);
	}

	/**
	* Post method handler for servlet functionality.
	* 
	* @param request The HTTP request to the servlet
	* @param response The HTTP response to the client
	* @see #doGet
	*/
	public void doPost(HttpServletRequest request, 
											HttpServletResponse response)
		throws ServletException, IOException
	{
		doGet(request,response);
	}

	/**
	 * A simple string validator which checks for null or empty strings.
	 *
	 * @param s the string to validate
	 * @return true if the string is not null or empty
	 */
	public boolean validate (String s) { return (s != null && s.length() > 0); }

	// Dispatch request to the appripriate bean or whatever
	private void dispatchRequest(
		HttpServletRequest request, HttpServletResponse response)
		throws ServletException, IOException
	{
		HttpSession session = request.getSession(false);
		if (session == null) {
			request.setAttribute("message", "Not logged in!");
			forward("error.jsp", request, response);
			return;
		}
		
		String mode = request.getParameter("mode");
		System.out.println("Communicate: Mode is "+ mode);
		
		if (mode != null && mode.equals("send")) 
		{
			sendHelper(request, response);
		}
		else if (mode != null && mode.equals("recv"))
		{
			recvHelper(request, response);
		}
	}

	/**
	 * Preforms request dispatching for an HttpServletRequest servlet request.
	 *
	 * @param url the destination url or jsp
	 * @param request the servlet request
	 * @param response the servlet response 
	 * @see HttpServletRequest
	 * @see HttpServletResponse
	 */
	public static void forward 
		(String url, HttpServletRequest request, HttpServletResponse response)
	{
		RequestDispatcher rd = request.getRequestDispatcher(url);
		try {
			rd.forward(request, response);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	private void recvHelper(HttpServletRequest request, 
			HttpServletResponse response) {
		String userString = request.getParameter("from");
		
		if (!validate(userString)) {
			request.setAttribute("error", "Invalid Input");
			forward("error.jsp", request, response);
			return;
		}
		
		User fromUser;
		User toUser = (User) request.getSession().getAttribute("user_obj");
		try {
			System.out.println("Finding destination user " + userString);
			fromUser = UserBean.findUser(Integer.valueOf(userString));
			System.out.println("Found user with id of " + fromUser.getUserid());
			System.out.println("Sender id is " + toUser.getUserid());
		} catch (Exception e) {
			System.out.println("User not found");
			e.printStackTrace();
			return;
		}
		
		try {
			// Add the message
			List pend_mesgs = UserBean.getPendingMessages(toUser, fromUser);
			System.out.println("- Message Count: " + pend_mesgs.size());
			request.setAttribute("messages", pend_mesgs);
			request.setAttribute("toUser", toUser);
		} catch (Exception e) {
			System.out.println("Error while adding new message to queue.");
			e.printStackTrace();
			return;
		}

		forward("recv_JSON.jsp", request, response);
	}
	
	private void sendHelper(HttpServletRequest request, 
			HttpServletResponse response)
	{
		String toUserString = request.getParameter("to");
		String mesg = request.getParameter("mesg");
		
		if (! (validate(toUserString) && validate(mesg))) {
			request.setAttribute("error", "Invalid Input");
			forward("error.jsp", request, response);
			return;
		}
		
		User toUser;
		User fromUser = (User) request.getSession().getAttribute("user_obj");
		try {
			System.out.println("Finding destination user");
			toUser = UserBean.findUser(Integer.valueOf(toUserString));
		} catch (Exception e) {
			System.out.println("User not found");
			e.printStackTrace();
			return;
		}
		
		try {
			// Add the message
			PendingMessageBean.addMessage(fromUser, toUser, mesg);
		} catch (Exception e) {
			System.out.println("Error while adding new message to queue.");
			e.printStackTrace();
			return;
		}

		request.setAttribute("fromUser", fromUser);
		request.setAttribute("toUser", toUser);
		request.setAttribute("mesg", mesg);

		System.out.println("Sending message from "
			+ fromUser.getUsername() + " to " 
			+ toUser.getUsername() + "; mesg is " + mesg);

		forward("send_JSON.jsp", request, response);
	}
}

