/*
 * UserRegister.java
 *
 * Created on 10 de agosto de 2004, 18:54
 */

package com.fenalco.servlets;

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



/**
 *
 * @author  andres
 * @version
 *
 * recibe la información de un nuevo usuario y la intenta adicionar a la base
 * de datos
 */
public class UserRegister extends HttpServlet {
    
    /** Initializes the servlet.
     */
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        
    }
    
    /** Destroys the servlet.
     */
    public void destroy() {
        
    }
    
    /**
     * Recibe la información del usuario y de la mepresa, con eso crea un objeto de la
     * clase usuario y uno de la clase Company, les asigna los parametros
     * recibidos y le indica que se
     * almacene en la base de datos llamando al método saveData.
     *
     * Los parámetros de la empresa que recibe son los siguientes:
     *
     * - type: tipo de empresa (puede ser minorista o proveedor)
     * - socialName: razón social de la empresa
     * - commercialname: nombre de la empresa
     * - description: descripción de la empresa
     * - companyId: NIT de la empresa
     * - sector: sector económico de la empresa
     * - address: dirección de la empresa
     * - phoneNumber1: número telefonico principal de la empresa
     * - phoneNumber2: número telefónico secundario de la empresa
     * - contact1: nombre de la persona de contacto 1
     * - contact2: nombre de la persona de contacto 2
     * - 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 donde se encuentra la empresa
     * - province: departamento donde se encuentra la empresa
     * - city: ciudad en donde se encuentra la empresa
     * - zone: zona en donde se encuentra la empresa
     * - neighbourhood: barrio en donde se encuentra la empresa
     * - combo: selección geográfica que realizó el usuario, puede ser país, departamento,
     *   ciudad o barrio, esto se usa para saber que información pasarle al jsp en las
     *   listas
     *
     *  Además de estos datos, recibe los siguientes con información acerca
     * del usuario
     *
     * - login: nombre de usuario
     * - passwd: contraseña
     * - passwd2: confirmacion de la contraseña
     * - firstName: nombre
     * - lastName: apellido
     * - position: cargo
     * - userEmail: email
     * - idNumber: cédula del usuario
     *
     * Si el tipo de empresa es proveedor, recibe la siguiente información:
     *
     * - GLN: global localization number del proveedor
     *
     * Crea un nuevo objeto de la clase Transaction para manejar una transacción con
     * la base de datos
     * Con los datos de la empresa crea un objeto de tipo Company, le adiciona
     * los datos recibidos y llama a la función saveData pasandole la transacción
     * para almacenar esta información en la base de datos
     *
     * Con los datos del usuario, crea un objeto de tipo User, le adiciona los
     * datos recibidos y llama a la función saveData pasandole la transacción
     * para almacenar esta información en la base de datos.
     *
     * Si la empresa es de tipo proveedor, crea un objeto de tipo Supplier, le
     * adiciona los datos especificos al proveedor y llama a la función
     * saveData pasandole la transacción para almacenar esta información en la base de datos.
     *
     * llama al método execute de la transacción para ejecutarla
     *
     * Luego de almacenar la información tanto de la empresa como del usuario,
     * se redireccióna a finalizaregistro.jsp y se envia un mensaje indicandole
     * al usuario el resultado de su registro, ya sea que haya sido exitoso o
     * que no se haya podido completar por algun motivo
     * @param request servlet request
     * @param response servlet response
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        
        
        String url = new String("/index.jsp");
        String message = null;
        boolean flag = true;
        Transaction transaction = new Transaction();
        User user = new User();
        Supplier supplier = new Supplier();
        ShopKeeper shopKeeper = new ShopKeeper();
        Company company = new Company();
        //datos empresa
        
        String type = request.getParameter("type");
        String socialName = request.getParameter("socialName");
        String commercialName = request.getParameter("commercialName");
        String description = request.getParameter("description");
        String companyId = 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");
                  
        if(phoneNumber2.length() == 0){
            phoneNumber2 = "0";
        }
         
        if(fax.length() == 0){
            fax = "0";
        }
        
        //datos usuario
        String login = request.getParameter("login");
        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");
        
        
       //datos proveedor
     
       if(PasswordHandler.existLogin(login)==false){
           if(passwd.equals(passwd2)){
               if(GLN.equals("") || !DataAccess.existGLN(GLN)){
                        try{
                            //1. crear datos empresa
                           int idType = new Integer(type).intValue();
                           String typeName = (String)DataAccess.getCompanyTypes().get(new Integer(type));


                           company.setType(idType);
                           company.setTypeName( typeName);

                           company.setSocialName(socialName);
                           company.setCommercialName(commercialName);
                           company.setDescription(description);
                           company.setNit(companyId);
                           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.setStatus(1);
                           company.setStatusName(DataAccess.getCompanyStatusName(1));
                           company.setGln(GLN);
                           company.setRegisterDate(new Date(new java.util.Date().getTime()));

                           //registrar datos empresa
                           company.saveData(transaction);

                           //2. crear dtos usuario

                           user.setCompanyId(company.getId());
                           user.setCompanyName(commercialName);
                           user.setEmail(userEmail);
                           user.setFirstName(firstName);
                           user.setIdentificationNumber(idNumber);
                           user.setLastName(lastName);
                           user.setLogin(login);
                           user.setPassword(passwd);
                           user.setPhoneNumber(phoneNumber1);
                           user.setPositionId(Integer.parseInt(position));
                           if(idType==1){
                                 user.setRoleId(3);//minorista
                           }
                           else{
                               user.setRoleId(2);//proveedor
                           }
                           user.setRoleName(typeName);


                           //registrar datos usuario

                           user.saveData(transaction);


                           //3.Crear datos proveedor o minorista
                           if(idType == 2) {
                               supplier.setSupplierId(company.getId());
                               supplier.setGln(GLN);
                               supplier.setSupplierName(commercialName);
                               supplier.setbillingType(1);
                               supplier.setCatalogueStatus(1);

                               supplier.saveData(transaction);

                           }
                           else if(idType == 1){
                               shopKeeper.setShopKeeperId(company.getId());
                               shopKeeper.setShopKeeperName(commercialName);
                               shopKeeper.setNurit(0);
                               shopKeeper.saveData(transaction);
                           }

                           //ejecutar transaction
                           flag = transaction.execute();
                           if(flag==true){
                            message = MessageBuilder.buildMessage(17);
                           }
                           else{
                               message = MessageBuilder.buildMessage(18);
                           }

                     }
                     catch(Exception qe){
                         message   = MessageBuilder.buildMessage(17);
                         //message="ERROR EN LA TRANSACCION "+qe.getMessage();
                     }
               }
               else{
                   message = MessageBuilder.buildMessage(22);
                   url = "/cargarregistro";
                   
               }
                
           }
           else{
               message = MessageBuilder.buildMessage(1);
           }
           
       }
        
       else{
           message = MessageBuilder.buildMessage(2);
       }
         
         
       
     RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(url);
     request.setAttribute("message",message);
     dispatcher.forward(request,response);
        
    }
    
    /** Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException
    {
        processRequest(request, response);
    }
    
    /** Returns a short description of the servlet.
     */
    public String getServletInfo() {
        return "Short description";
    }
    
}
