/*
 * CommunityHandler.java
 *
 * Created on 25 de agosto de 2004, 15:40
 */

package com.fenalco.servlets.supplier;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletConfig;
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 com.fenalco.entities.Community;
import com.fenalco.entities.Log;
import com.fenalco.entities.User;
import com.fenalco.utilities.MessageBuilder;
import com.fenalco.utilities.database.Transaction;

/**
 * Este servlet administra las solicitudes de operaciones sobre los
 * establecimientos de una comunidad específica del proveedor de acuerdo con el
 * valor del parámetro <CODE>operationType</CODE>
 * 
 * @author Mario Linares Vásquez
 */
public class CommunityHandler extends HttpServlet
{

	/**
	 * Inicializa el servlet.
	 * 
	 * @param config
	 * @throws ServletException
	 */
	public void init( ServletConfig config ) throws ServletException
	{
		super.init(config);

	}

	/**
	 * Método destructor.
	 */
	public void destroy( )
	{

	}

	/**
	 * Procesa las solicitudes para los métodos HTTP <code>GET</code> y
	 * <code>POST</code>. Recibe los parámetros <CODE>operationType</CODE>
	 * y <CODE>storeId</CODE> que identifican el tipo de operación y el id del
	 * establecimiento respectivamente .
	 * 
	 * De acuerdo con el valor de <CODE>operationType</CODE> este método hace
	 * lo siguiente :
	 *  - operationType = delete invoca la función deleteStore con el parámetro
	 * storeId
	 *  - operationType = new invoca la función addStore con el request como
	 * parámetro
	 *  - operationType = update invoca la función updateCommunity con el
	 * request como parámetro
	 * 
	 * El flujo se redirecciona al servlet comunidad
	 * 
	 * @param request
	 *            servlet request
	 * @param response
	 *            servlet response
	 * @throws ServletException
	 * @throws IOException
	 */
	protected void processRequest( HttpServletRequest request,
			HttpServletResponse response ) throws ServletException, IOException
	{
		HttpSession session = request.getSession(false);
		RequestDispatcher dispatcher;
		String url = "/proveedor/comunidad?key="
				+ request.getParameter("communityId");
		String message = "";
		String operationType = request.getParameter("operationType");

	    try
	    {
	        if( session == null || ( User )session.getAttribute( "user" ) == null || ( ( User )session.getAttribute( "user" ) ).getRoleId() != 2 )
			{
				url = "/logout";
				//message = "Sesión no iniciada";
				message = MessageBuilder.buildMessage(15);
	
			}
			else
			{
	
				if( operationType.equals("delete") )
				{
					String[] items = request.getParameterValues("item");
	
					if( items != null )
					{
						Transaction t = new Transaction();
						boolean ready = true;
						for( int i = 0; i < items.length; i++ )
						{
							if( !removeStore(t, new Integer(request
									.getParameter("communityId")).intValue(),
									new Integer(items[i]).intValue()) )
							{
								ready = false;
								break;
							}
							else
							{
								t.execute();
							}
						}
						if( !ready )
						{
							//Fallo al actualizar los datos
							message = MessageBuilder.buildMessage(7);
						}
						else
						{
							//Actualizacion de datos exitosa
							message = MessageBuilder.buildMessage(4);
							
							// guardo el registro en el log
		                    try
		                    {
		                        Transaction t1 = new Transaction( );
		                        Log l = new Log( );
		                        User user = ( User )session.getAttribute( "user" );
		                        String userId = user.getLogin();
		                        String numberId = user.getIdentificationNumber();
		                        String externalUser = "";
		                        String description = "El proveedor eliminó esatblecimientos de la comunidad";
		                        User callcenter = ( User )session.getAttribute( "callcenter" );
		                        if( callcenter != null )
		                        {
		                            externalUser = callcenter.getLogin();
		                        }
		                        l.saveData(userId, numberId, 51, description, externalUser, t1 );
		                        t1.execute();
		                    }
		                    catch( Exception ex )
		                    {
		                        System.out.println( "Error guardando el Log." );
		                    }
	
						}
					}
					else
					{
						//No se selecciono un establecimiento
						message = MessageBuilder.buildMessage(4);
					}
				}
				else
					if( operationType.equals("add") )
					{
						String[] items = request.getParameterValues("item");
	
						if( items != null )
						{
							Transaction t = new Transaction();
							boolean ready = true;
							for( int i = 0; i < items.length; i++ )
							{
								int commId = new Integer(request.getParameter("communityId")).intValue();
								int stId = new Integer(items[i]).intValue(); 
								if( !addStore(t, commId, stId ) )
								{
									ready = false;
									break;
								}
								else
								{
									t.execute();
								}
							}
							if( !ready )
							{
								//Fallo al actuazliar los datos
								message = MessageBuilder.buildMessage(7);
							}
							else
							{
								//Actualizacion de datos exitosa
								message = MessageBuilder.buildMessage(4);
								
								// guardo el registro en el log
			                    try
			                    {
			                        Transaction t1 = new Transaction( );
			                        Log l = new Log( );
			                        User user = ( User )session.getAttribute( "user" );
			                        String userId = user.getLogin();
			                        String numberId = user.getIdentificationNumber();
			                        String externalUser = "";
			                        String description = "El proveedor adiciono esatblecimientos a la comunidad";
			                        User callcenter = ( User )session.getAttribute( "callcenter" );
			                        if( callcenter != null )
			                        {
			                            externalUser = callcenter.getLogin();
			                        }
			                        l.saveData(userId, numberId, 50, description, externalUser, t1 );
			                        t1.execute();
			                    }
			                    catch( Exception ex )
			                    {
			                        System.out.println( "Error guardando el Log." );
			                    }
	
							}
						}
						else
						{
							//No se selecciono un establecimiento
							message = MessageBuilder.buildMessage(4);
						}
					}
					else
						if( operationType.equals("view") )
						{
	
						}
			}
	    }
	    catch( Exception e )
	    {
	        url="/logout";
	        message = MessageBuilder.buildMessage(15);
	    }

		request.setAttribute("message", message);
		dispatcher = getServletContext().getRequestDispatcher(url);
		dispatcher.forward(request, response);
	}

	/**
	 * Este método crea una instancia de la clase <CODE>SQLUtilities</CODE> y
	 * ejecuta el método <CODE>execute</CODE> con una sentencia de tipo delete
	 * para eliminar el establecimiento de la tabla comunidad_establecimiento.
	 * 
	 * @param storeId
	 *            id del establecimiento
	 * @return boolean que representa el exito del proceso
	 */
	public boolean removeStore( Transaction t, int communityId, int storeId )
	{
		boolean response = true;
		Community community = new Community(communityId);
		if( !community.removeStore(t, storeId) )
		{
			response = false;
		}

		return response;
	}

	/**
	 * Este método inserta un nuevo registro en la tabla
	 * comunidad_establecimiento de acuerdo con los parámetros del <CODE>
	 * request</CODE>. Para tal efecto crea una instancia de la clase <CODE>
	 * SQLUtilities</CODE> e invoca el método <CODE>execute</CODE> con una
	 * sentencia de tipo insert.
	 * 
	 * @param request
	 *            request del servlet
	 * @return boolean que representa el exito del proceso
	 */
	public boolean addStore( Transaction t, int communityId, int storeId )
	{
		boolean response = true;
		Community community = new Community(communityId);
		if( !community.addStore(t, storeId) )
		{
			response = false;
		}

		return response;
	}

	public boolean updateCommunity( HttpServletRequest request )
	{
		HttpSession session = request.getSession();
		Transaction t = new Transaction();

		boolean response = true;
		int communityId = new Integer(request.getParameter("communityId"))
				.intValue();

		Community community = new Community(communityId);
		community.setName( request.getParameter("communityName"));

		if( !community.update(t) )
		{
			response = false;
		}
		else
			if( !t.execute() )
			{
				response = false;
			}

		return response;
	}

	/**
	 * Procesa el método HTTP <code>GET</code>.
	 * 
	 * @param request
	 *            servlet request
	 * @param response
	 *            servlet response
	 * @throws ServletException
	 * @throws IOException
	 */
	protected void doGet( HttpServletRequest request,
			HttpServletResponse response ) throws ServletException, IOException
	{
		processRequest(request, response);
	}

	/**
	 * Procesa el método HTTP <code>POST</code> method.
	 * 
	 * @param request
	 *            servlet request
	 * @param response
	 *            servlet response
	 * @throws ServletException
	 * @throws IOException
	 */
	protected void doPost( HttpServletRequest request,
			HttpServletResponse response ) throws ServletException, IOException
	{
		processRequest(request, response);
	}

	/**
	 * Retorna una breve descripción del servlet.
	 * 
	 * @return
	 */
	public String getServletInfo( )
	{
		return "Short description";
	}

}