/*
 * DataView.java
 *
 * Created on 10 de agosto de 2004, 17:52
 */

package com.fenalco.servlets.shopkeeper;

import java.io.IOException;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Vector;

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.City;
import com.fenalco.entities.Company;
import com.fenalco.entities.DataAccess;
import com.fenalco.entities.PositionList;
import com.fenalco.entities.Province;
import com.fenalco.entities.User;
import com.fenalco.utilities.MessageBuilder;

/**
 * Este servlet carga la información que se necesita en misdatos.jsp
 * 
 * @author Mario Linares Vásquez
 */
public class DataView 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( )
	{

	}

	/**
	 * Este servlet carga la información que se necesita en misdatos.jsp, la
	 * cual es la siguiente:
	 *  - sectorList: Lista de sectores económicos con la cual se construye el
	 * selector sector. Esta lista se obtiene llamando al método <CODE>
	 * getSectors</CODE> de la clase <CODE>DataAccess</CODE>
	 *  - companyTypes: lista de tipos de compañias. Esta lista se obtiene
	 * llamando al método <CODE>getCompanyTypes</CODE> de la clase <CODE>
	 * DataAccess</CODE>
	 *  - citiesList: lista de ciudades. Esta lista se obtiene llamando al
	 * método <CODE>getCities</CODE> de la <CODE>clase DataAccess</CODE>.
	 *  - countriesList: lista de paises. Esta lista se obtiene llamando al
	 * método <CODE>getCountries</CODE> de la clase <CODE>DataAccess</CODE>
	 *  - provincesList: lista de departamentos. esta lista se obtiene llamando
	 * al método <CODE>getProvinces</CODE> de la clase <CODE>DataAccess
	 * </CODE>
	 *  - neighbourhoodsList. lista de barrios. Esta lista se obtiene llamando
	 * al método <CODE>getNeighbourhoods</CODE> de la clase <CODE>DataAccess
	 * </CODE>
	 *  - zonesList. Lista de zonas. Esta lista se obtiene llamando al método
	 * <CODE>getZones</CODE> de la clase <CODE>DataAccess</CODE>
	 *  - ciiuList. Lista de ciiu. Esta lista se obtiene llamando al método
	 * <CODE>getCiiu</CODE> de la clase <CODE>DataAccess</CODE>
	 * 
	 * Nota: todos los métodos de la clase <CODE>DataAccess</CODE> son
	 * estáticos, por lo tanto no hay que instanciar esta clase.
	 * 
	 * Además de esos listados, se deben cargar los datos de la empresa, para
	 * ello se crea un objeto de tipo <CODE>Company</CODE> pasandole al
	 * constructor el id de la empresa que se encuentra en la información del
	 * usuario (toda la información) del usuario se encuentra en la sesión.)
	 * 
	 * Nota: en el jsp primero se debe cargar únicamente la lista de los paises,
	 * y cuando el usuario seleccione un país, se le debe mostrar la lista de
	 * los departamentos asociados a dicho país, cuando seleccione un
	 * departamento se le debe mostrar la lista de todas las ciudades asociadas
	 * a ese departamento, y cuando seleccione una ciudad se le debe mostrar la
	 * lista de barrios asociados a dicha ciudad. Por lo tanto este servlet debe
	 * recibir los siguientes parámetros para realizar la carga de datos.
	 *  - country: id del país seleccionado, si este parámetro no viene, no se
	 * cargan las demás listas, si viene se carga la lista de departamentos de
	 * dicho país
	 *  - province: id del departamento seleccionado, si no viene no se cargan
	 * las listas de ciudad ni de barrio, si viene, se carga la lista de todas
	 * las ciudades asociadas a ese departamento.
	 *  - city: id de la ciudad seleccionada, si no viene, no se carga la lista
	 * de barrios, si viene, se carga la lista de barrios asociados a esta
	 * ciudad.
	 * 
	 * @param request
	 *            servlet request
	 * @param response
	 *            servlet response
	 * @throws ServletException
	 * @throws IOException
	 */
	protected void processRequest( HttpServletRequest request,
			HttpServletResponse response ) throws ServletException, IOException
	{

		//url para redireccionamiento del flujo
		String url = new String("/minorista/misdatos.jsp");
        HttpSession session = request.getSession( false );
        String message = "";

	    try
	    {
	        if( session != null && ( User )session.getAttribute( "user" ) != null && ( ( User )session.getAttribute( "user" ) ).getRoleId() == 3 )
			{
				User user = (User) request.getSession().getAttribute("user");
	
				String type = null;
				String nit = null;
				String socialName = null;
				String commercialName = null;
				String description = null;
				String sector = null;
				String address = null;
				String phoneNumber1 = null;
				String phoneNumber2 = null;
				String contact1 = null;
				String contact2 = null;
				String email = null;
				String fax = null;
				String fenalcoNumber = null;
				String login = null;
				String passwd = null;
				String passwd2 = null;
				String firstName = null;
				String lastName = null;
				String userEmail = null;
				String GLN = null;
				String idNumber = null;
	
				/////////////////////////
				Vector countriesList = DataAccess.getValidCountries();
				Vector provincesList = null;
				Vector citiesList = null;
				Vector neighbourhoodsList = null;
	
				int countryId = 1;
				int provinceId = 1;
				int cityId = 1;
				int neighbourhoodId = 1;
				int positionId = 1;
	
				String combo = request.getParameter("combo");
				if( combo != null )
				{
	
					//cargar datos que aparacen el el formulario
					type = request.getParameter("type");
					socialName = request.getParameter("socialName");
					nit = request.getParameter("companyId");
					GLN = request.getParameter("GLN");
					commercialName = request.getParameter("commercialName");
					description = request.getParameter("description");
					sector = request.getParameter("sector");
					address = request.getParameter("address");
					phoneNumber1 = request.getParameter("phoneNumber1");
					phoneNumber2 = request.getParameter("phoneNumber2");
					contact1 = request.getParameter("contact1");
					contact2 = request.getParameter("contact2");
					email = request.getParameter("email");
					fax = request.getParameter("fax");
					fenalcoNumber = request.getParameter("fenalcoNumber");
					login = request.getParameter("login");
					passwd = request.getParameter("passwd");
					passwd2 = request.getParameter("passwd2");
					firstName = request.getParameter("firstName");
					lastName = request.getParameter("lastName");
					userEmail = request.getParameter("userEmail");
					idNumber = request.getParameter("idNumber");
	
					countryId = (new Integer(request.getParameter("country")))
							.intValue();
					provinceId = (new Integer(request.getParameter("province")))
							.intValue();
					cityId = (new Integer(request.getParameter("city"))).intValue();
					positionId = (new Integer(request.getParameter("position")))
							.intValue();
					String temp = request.getParameter("neighbourhood");
					if( temp != null )
					{
						neighbourhoodId = (new Integer(temp)).intValue();
					}
	
					provincesList = DataAccess.getValidProvinces(countryId);
					citiesList = DataAccess.getValidCities(provinceId);
					neighbourhoodsList = DataAccess.getNeighbourhoods(cityId);
	
					if( combo.equals("country") )
					{
	
						Enumeration en = provincesList.elements();
						provinceId = ((Province) en.nextElement()).getId();
						citiesList = DataAccess.getCities(provinceId);
						en = citiesList.elements();
						cityId = ((City) en.nextElement()).getId();
						neighbourhoodsList = DataAccess.getNeighbourhoods(cityId);
	
					}
					else
						if( combo.equals("province") )
						{
							//    citiesList = DataAccess.getCities( provinceId);
							Enumeration en = citiesList.elements();
							cityId = ((City) en.nextElement()).getId();
							neighbourhoodsList = DataAccess
									.getNeighbourhoods(cityId);
						}
	
				}
				else
				{
					//incio por primera vez, es decir sin recarga, por lo tanto se
					// deben cargas
					//los datos residentes en la base de datos.
	
					int companyId = user.getCompanyId();
					Company company = new Company(companyId);
					type = Integer.toString(company.getType());
					socialName = company.getSocialName();
					GLN = company.getGln();
					commercialName = company.getCommercialName();
					nit = company.getNit();
					description = company.getDescription();
					sector = Integer.toString(company.getSectorCode());
					address = company.getAddress();
					phoneNumber1 = company.getPhoneNumber1();
					phoneNumber2 = company.getPhoneNumber2();
					contact1 = company.getContact1();
					contact2 = company.getContact2();
					email = company.getEmail();
					fax = company.getFax();
					fenalcoNumber = company.getFenalcoNumber();
					login = user.getLogin();
					passwd = user.getPassword();
					passwd2 = "";
					firstName = user.getFirstName();
					lastName = user.getLastName();
					positionId = user.getPositionId();
					userEmail = user.getEmail();
					idNumber = user.getIdentificationNumber();
	
					cityId = company.getCityId();
					provinceId = DataAccess.getCityProvince(cityId);
					countryId = DataAccess.getProvinceCountry(provinceId);
	
					//listas
	
					provincesList = DataAccess.getValidProvinces(countryId);
					citiesList = DataAccess.getValidCities(provinceId);
	
					//neighbourhoodsList = DataAccess.getNeighbourhoods(cityId);
				}
	
				//sector
				int sectorId = 1;
				String temp = request.getParameter("sector");
				if( temp != null )
				{
					sectorId = (new Integer(temp)).intValue();
				}
	
				//ciiu
				int ciiuId = 1;
				temp = request.getParameter("ciiu");
				if( temp != null )
				{
					ciiuId = (new Integer(temp)).intValue();
				}
	
				Hashtable sectorList = DataAccess.getSectors();
				Hashtable companyTypes = DataAccess.getCompanyTypes();
	
				Hashtable ciiuList = DataAccess.getCiiu();
				Vector positionList = (new PositionList()).getPositions();
	
				//indices de selección para las listas geográficas
	
				request.setAttribute("sectorId", new Integer(sectorId));
				request.setAttribute("ciiuId", new Integer(ciiuId));
				request.setAttribute("countryId", new Integer(countryId));
				request.setAttribute("cityId", new Integer(cityId));
				request.setAttribute("provinceId", new Integer(provinceId));
				//request.setAttribute("neighbourhoodId", new
				// Integer(neighbourhoodId));
	
				if( type == null )
				{
					type = "";
				}
				if( GLN == null )
				{
					GLN = "";
				}
				if( socialName == null )
				{
					socialName = "";
				}
				if( commercialName == null )
				{
					commercialName = "";
				}
	
				if( description == null )
				{
					description = "";
				}
				if( sector == null )
				{
					sector = "";
				}
				if( address == null )
				{
					address = "";
				}
				if( phoneNumber1 == null )
				{
					phoneNumber1 = "";
				}
				if( phoneNumber2 == null )
				{
					phoneNumber2 = "";
				}
				if( contact1 == null )
				{
					contact1 = "";
				}
				if( contact2 == null )
				{
					contact2 = "";
				}
				if( email == null )
				{
					email = "";
				}
				if( fax == null )
				{
					fax = "";
				}
				if( fenalcoNumber == null )
				{
					fenalcoNumber = "";
				}
				if( login == null )
				{
					login = "";
				}
				if( passwd == null )
				{
					passwd = "";
				}
				if( passwd2 == null )
				{
					passwd2 = "";
				}
				if( firstName == null )
				{
					firstName = "";
				}
				if( lastName == null )
				{
					lastName = "";
				}
	
				if( userEmail == null )
				{
					userEmail = "";
				}
				if( idNumber == null )
				{
					idNumber = "";
				}
	
				//datos empresa
	
				request.setAttribute("socialName", socialName);
				request.setAttribute("companyId", nit);
				request.setAttribute("GLN", GLN);
				request.setAttribute("commercialName", commercialName);
				request.setAttribute("description", description);
				request.setAttribute("sector", sector);
				request.setAttribute("address", address);
				request.setAttribute("phoneNumber1", phoneNumber1);
				request.setAttribute("phoneNumber2", phoneNumber2);
				request.setAttribute("contact1", contact1);
				request.setAttribute("contact2", contact2);
				request.setAttribute("email", email);
				request.setAttribute("fax", fax);
				request.setAttribute("fenalcoNumber", fenalcoNumber);
	
				//dato usuario
				request.setAttribute("login", login);
				request.setAttribute("passwd", passwd);
				request.setAttribute("passwd2", passwd2);
				request.setAttribute("firstName", firstName);
				request.setAttribute("lastName", lastName);
				request.setAttribute("position", new Integer(positionId));
				request.setAttribute("userEmail", userEmail);
				request.setAttribute("idNumber", idNumber);
	
				//listas
				request.setAttribute("sectorList", sectorList);
				//request.setAttribute("companyTypes",companyTypes);
				request.setAttribute("citiesList", citiesList);
				request.setAttribute("countriesList", countriesList);
				request.setAttribute("provincesList", provincesList);
				//request.setAttribute("neighbourhoodsList",neighbourhoodsList);
				request.setAttribute("ciiuList", ciiuList);
				request.setAttribute("positionList", positionList);
	
			}
			else
			{
				message = MessageBuilder.buildMessage(15);
				url = "/index.jsp";
			}
	    }
	    catch( Exception e )
	    {
	        url="/logout";
	        message = MessageBuilder.buildMessage(15);
	    }
		request.setAttribute("message", message);
		RequestDispatcher dispatcher = getServletContext()
				.getRequestDispatcher(url);
		dispatcher.forward(request, 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>.
	 * 
	 * @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 de el servlet.
	 * 
	 * @return
	 */
	public String getServletInfo( )
	{
		return "Short description";
	}

}