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

package com.fenalco.servlets.shopkeeper;

import java.io.IOException;
import java.sql.Date;

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.Company;
import com.fenalco.entities.ShopKeeper;
import com.fenalco.entities.DataAccess;
import com.fenalco.entities.Log;
import com.fenalco.entities.User;
import com.fenalco.utilities.MessageBuilder;
import com.fenalco.utilities.database.Transaction;

/**
 * Este Servlet recibe los datos que han sido modificados por el usuario y
 * actualiza la base de datos
 * 
 * @author andres
 */
public class DataHandler 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( )
	{

	}

	/**
	 * Recibe información tanto de la empresa como del usuario para actualizarla
	 * en la base de datos.
	 * 
	 * La información de la empresa que recibe es la siguiente: - socialName:
	 * razón social de la empresa - commercialName: nombre de la compañía -
	 * description: descripción de la compañía - companyId: NIT de la compañía -
	 * sector: sector económico al cual pertenece la empresa - address:
	 * dirección de la empresa - phoneNumber1: teléfono de la empresa -
	 * phoneNumber2: telefono 2 de la empresa - contact1: persona contacto 1 con
	 * la empresa - contact2: persona contacto 2 con la empresa - fax: número de
	 * fax de la empresa - email: correo electrónico de la empresa -
	 * fenalcoNumber: número de afiliación a fenalco de la empresa - ciiu: ciiu
	 * de la empresa - country: país en el cual se encuentra la empresa -
	 * province: departamento en el cual se encuentra la empresa - city: ciudad
	 * en la cual se encuentra la empresa - zone: zona en la cual se encuentra
	 * la empresa - neighbourhood: barrio en el cual se encuentra la empresa
	 * 
	 * Además de estos datos, también se reciben los datos del usuario:
	 *  - login: Nombre de usuario - passwd: contraseña del usuario - passwd2:
	 * confirmación de la contraseña - firstName: nombre del usuario - lastName:
	 * apellido del usuario - position: cargo del usuario en la empresa -
	 * userEmail: correo electrónico del usuario - idNumber: cédula del usuario
	 * 
	 * Una vez se reciban estos datos, se crea un objeto de tipo <CODE>Company
	 * </CODE> con los datos de la empresa y un objeto de tipo <CODE>User
	 * </CODE> con los datos del usuario y se actualiza la base de datos
	 * enviando los datos de la empresa y del usuario en una misma transacción.
	 * 
	 * después de actualizar los datos en la base de datos, se redirecciona a
	 * <CODE>/minorista/misdatos</CODE> enviandole un mensaje que indique si
	 * los datos se han actualizado correctamente o no
	 * 
	 * @param request
	 *            servlet request
	 * @param response
	 *            servlet response
	 * @throws ServletException
	 * @throws IOException
	 */
	protected void processRequest( HttpServletRequest request,
			HttpServletResponse response ) throws ServletException, IOException
	{

		String url = "/minorista/misdatos";
        HttpSession session = request.getSession( false );
        String message = "";
        
	    try
	    {
	        User user = (User) request.getSession().getAttribute("user");
                String name = user.getFirstName();
				
	        if( session != null && ( User )session.getAttribute( "user" ) != null && ( ( User )session.getAttribute( "user" ) ).getRoleId() == 3 )
			{
	
				Company company = new Company(user.getCompanyId());
				boolean flag = false;
				Transaction transaction = new Transaction();
	
				String type = request.getParameter("type");
				String socialName = request.getParameter("socialName");
				String commercialName = request.getParameter("commercialName");
				//String description = request.getParameter("description");
				String nit = request.getParameter("companyId");
				String sector = request.getParameter("sector");
				String address = request.getParameter("address");
				String phoneNumber1 = request.getParameter("phoneNumber1");
				String phoneNumber2 = request.getParameter("phoneNumber2");
				String contact1 = request.getParameter("contact1");
				String contact2 = request.getParameter("contact2");
				String fax = request.getParameter("fax");
				String email = request.getParameter("email");
				//String fenalcoNumber = request.getParameter("fenalcoNumber");
				//String ciiu = request.getParameter("ciiu");
				String country = request.getParameter("country");
				String province = request.getParameter("province");
				String city = request.getParameter("city");
				String zone = request.getParameter("zone");
				String neighbourhood = request.getParameter("neighbourhood");
				//String GLN = request.getParameter("GLN");
				String updatePasswd = request.getParameter("updatePasswd");
                                String iva = request.getParameter("iva");
	
				if( phoneNumber2.length() == 0 )
				{
					phoneNumber2 = "0";
				}
	
				if( fax.length() == 0 )
				{
					fax = "0";
				}
	
				//datos usuario
				
				String passwd = request.getParameter("passwd");
				String passwd2 = request.getParameter("passwd2");
				String firstName = request.getParameter("firstName");
				String lastName = request.getParameter("lastName");
				String position = request.getParameter("position");
				String userEmail = request.getParameter("userEmail");
				String idNumber = request.getParameter("idNumber");
	
				if( passwd.equals(passwd2) )
				{
					try
					{
						//1. crear datos empresa
	 
						company.setSocialName(socialName);
						company.setCommercialName(commercialName);
						//company.setDescription(description);
						company.setNit(nit);
						company.setSectorCode(new Integer(sector).intValue());
						company.setSectorName((String) (DataAccess.getSectors()
								.get(new Integer(sector))));
						company.setAddress(address);
						company.setPhoneNumber1(phoneNumber1);
						company.setPhoneNumber2(phoneNumber2);
						company.setContact1(contact1);
						company.setContact2(contact2);
						company.setFax(fax);
						company.setEmail(email);
						//company.setFenalcoNumber(fenalcoNumber);
						//company.setCiiu(new Integer(ciiu).intValue());
						/*company.setCiiuCode(((String) (DataAccess.getCiiu()
								.get(new Integer(ciiu)))));*/
						int cityId = new Integer(city).intValue();
						company.setCityId(cityId);
						company.setCityName(DataAccess.getCityName(cityId));
						//company.setGln(GLN);
						company.setRegisterDate(new Date(new java.util.Date()
								.getTime()));
	
						//registrar datos empresa
						company.update(transaction);
	
						//2. crear dtos usuario
	
						user.setCompanyId(company.getId());
						user.setCompanyName(commercialName);
						user.setEmail(userEmail);
						user.setFirstName(firstName);
						user.setIdentificationNumber(idNumber);
						user.setLastName(lastName);
						
                                                
						if( updatePasswd != null )
						{
							
                                                    user.setPassword(passwd);
						}
                                                if( iva != null )
						{
							ShopKeeper shopKeeper = new ShopKeeper(company.getId());
                                                        shopKeeper.setIva(1);
                                                        shopKeeper.update(transaction);
						}
                                                else{
                                                    	ShopKeeper shopKeeper = new ShopKeeper(company.getId());
                                                        shopKeeper.setIva(0);
                                                        shopKeeper.update(transaction);
                                                }
	
						user.setPhoneNumber(phoneNumber1);
						user.setPositionId(Integer.parseInt(position));
	
						//registrar datos usuario
	
						user.update(transaction);
	
						//ejecutar transaction
						flag = transaction.execute();
						if( flag == true )
						{
							message = name+". "+MessageBuilder.buildMessage(17);
                                                        
						}
						else
						{
							message = name+". "+MessageBuilder.buildMessage(18);
                                                        
						}
	
					}
					catch (Exception qe)
					{
						message = name+". "+MessageBuilder.buildMessage(17);
                                                 
                                                 qe.printStackTrace();
                                                 
						//message="ERROR EN LA TRANSACCION "+qe.getMessage();
					}
	
				}
				else
				{
					// mensaje de contraseña no valida
					message = name+". "+"Verifique por favor que la confirmación y la contraseña son iguales" ;
                                        
				}
	
			}
			else
			{
				message = name+". "+MessageBuilder.buildMessage(15);
				url = "/index.jsp";
			}
	
			try
			{
				Transaction t = new Transaction();
				Log l = new Log();
				user = (User) session.getAttribute("user");
				String userId = user.getLogin();
				String numberId = user.getIdentificationNumber();
				String externalUser = "";
				User callcenter = (User) session.getAttribute("callcenter");
				if( callcenter != null )
				{
					externalUser = callcenter.getLogin();
				}
				l.saveData(userId, numberId, 16,
						"Actualización de datos del minorista", externalUser, t);
				t.execute();
			}
			catch (Exception ex)
			{
				System.out.println("Error guardando el Log.");
			}
	    }
	    catch( Exception e )
	    {
	        url="/logout";
	        message = MessageBuilder.buildMessage(15);
                e.printStackTrace();
	    }

		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";
	}

}