/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.arrebol.taxiservicios.beans.login;

import com.amazonaws.AmazonServiceException;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.simpleemail.AmazonSimpleEmailService;
import com.amazonaws.services.simpleemail.AmazonSimpleEmailServiceClientBuilder;
import com.amazonaws.services.simpleemail.model.Body;
import com.amazonaws.services.simpleemail.model.Content;
import com.amazonaws.services.simpleemail.model.Destination;
import com.amazonaws.services.simpleemail.model.Message;
import com.amazonaws.services.simpleemail.model.SendEmailRequest;
import com.amazonaws.services.simpleemail.model.SendEmailResult;
import com.arrebol.car.driver.security.CarDriverSecurity;
import com.arrebol.taxiservicios.beans.TaxiGenericBean;
import com.arrebol.taxiservicios.controller.catalog.UserLocationController;
import com.arrebol.taxiservicios.controller.catalog.UserOpenPayController;
import com.arrebol.taxiservicios.controller.system.UserController;
import com.arrebol.taxiservicios.model.catalog.LocationPaquetes;
import com.arrebol.taxiservicios.model.catalog.Paquetes;
import com.arrebol.taxiservicios.model.catalog.UserLocation;
import com.arrebol.taxiservicios.model.catalog.UserOpenPay;
import com.arrebol.taxiservicios.model.core.User;
import com.arrebol.taxiservicios.model.enums.GenericEnumType;
import java.io.IOException;
import java.io.Serializable;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.security.SecureRandom;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.Base64;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import javax.annotation.PostConstruct;
import javax.enterprise.context.SessionScoped;
import javax.faces.application.FacesMessage;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.inject.Named;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import mx.openpay.client.Address;
import mx.openpay.client.Card;
import mx.openpay.client.Charge;
import mx.openpay.client.Customer;
import mx.openpay.client.core.OpenpayAPI;
import mx.openpay.client.core.requests.transactions.CreateCardChargeParams;
import mx.openpay.client.exceptions.OpenpayServiceException;
import mx.openpay.client.exceptions.ServiceUnavailableException;
import mx.openpay.client.utils.SearchParams;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

/**
 *
 * @author Picasso
 */
@Named
@SessionScoped
public class LoginBean extends TaxiGenericBean implements Serializable {

    /**
     * Authentication and authorization user.
     *
     * @throws IOException from {@link ExternalContext#redirect(String)}
     */
    public void login() throws IOException {
        ExternalContext externalContext = externalContext();
        HttpServletRequest request = (HttpServletRequest) externalContext.getRequest();

        try {
            logger.info("User: " + getUsername());
            request.login(getUsername(), getPassword());
            // se obtiene  el usuario
            setUserController(new UserController());
            User user = getUserController().getByUserNameAndPassword(getUsername(), getPassword());
            if (user != null) {
                // Validación del paquete 
                
                    externalContext.getSessionMap().put(TAXI_SERVICIOS, user);
                    externalContext.redirect(forwardUrl);
                
            }

        } catch (ServletException | IOException e) {
            logger.error("Login() - " + e);
            showMessage(FacesMessage.SEVERITY_ERROR, getBundlePropertyFile().getString("error.access.title"), getBundlePropertyFile().getString("error.access.details"));
        } catch (Exception e) {
            logger.error("Login() - " + e);
            showMessage(FacesMessage.SEVERITY_FATAL, getBundlePropertyFile().getString("fatal.access.title"), getBundlePropertyFile().getString("fatal.access.details"));
        }
    }

    /**
     * Remove current user from session.
     *
     * @throws IOException from {@link ExternalContext#redirect(String)}
     */
    public void logout() throws IOException {
        try {
            ExternalContext externalContext = externalContext();

            externalContext.invalidateSession();
            externalContext.redirect(externalContext.getRequestContextPath() + LOGIN);
        } catch (IOException e) {
            logger.error("logout() - " + e);
        }
    }

    /**
     * Check if currently user has the given role.
     *
     * @param role Role to be search.
     * @return true if user has given role otherwise false..
     */
    public boolean isUserInRole(String role) {
        FacesContext context = facesContext();
        ExternalContext externalContext = context.getExternalContext();

        return externalContext.isUserInRole(role);
    }

    /**
     *
     * @return
     */
    private String extractRequestedUrlBeforeLogin() {
        ExternalContext externalContext = externalContext();

        String requestedUrl = (String) externalContext.getRequestMap().get(RequestDispatcher.FORWARD_REQUEST_URI);
        if (null == requestedUrl) {
            return externalContext.getRequestContextPath() + LOGIN;
        }

        String queryString = (String) externalContext.getRequestMap().get(RequestDispatcher.FORWARD_QUERY_STRING);

        return requestedUrl + (queryString == null ? "" : "?" + queryString);
    }

    public void enviarCorreo() {
        logger.info("enviarCorreo");
        if (getMailVal() == null || getMailVal().isEmpty()) {
            showMessage(FacesMessage.SEVERITY_ERROR, "Error", "Debe colocar su usuario (correo) y contraseña para validar su usuario y recibir el correo de confirmación");
        } else if (getPasswordVal() == null || getPasswordVal().isEmpty()) {
            showMessage(FacesMessage.SEVERITY_ERROR, "Error", "Debe colocar su usuario (correo) y contraseña para validar su usuario y recibir el correo de confirmación");
        } else if (!getEnviandoCorreo()) {
            setEnviandoCorreo(true);
            logger.info("enviarCorreo");
            // se obtiene  el usuario
            setUserController(new UserController());
            setLogUser(getUserController().getByUserNameAndPassword(getMailVal(), new CarDriverSecurity(APP, getPasswordVal()).getPassword()));
            if (getLogUser() != null) {
                int CODE_LENGTH = 4; // Longitud del código de verificación
                SecureRandom secureRandom = new SecureRandom();
                byte[] randomBytes = new byte[CODE_LENGTH];
                secureRandom.nextBytes(randomBytes);
                // Codificar los bytes aleatorios en una cadena legible
                String verificationCode = Base64.getUrlEncoder().withoutPadding().encodeToString(randomBytes);
                setClaveEnviada(verificationCode);
                // Se envía el código de deificación 
                setCheckEmail(getMailVal(), verificationCode);
            } else {
                setEnviandoCorreo(false);
                showMessage(FacesMessage.SEVERITY_ERROR, "Error", "El usuario o la contraseña son incorrectas");
            }
        }
    }

    public void validarCorreo() {
        if (getClaveEnviada() == null) {
            showMessage(FacesMessage.SEVERITY_ERROR, "Error", "Primero debe de enviar el correo de verificación para validar la clave");
        } else if (getClaveEnviada().equals(getClaveIngresada())) {
            setRequired(false);
            setUserController(new UserController());
            setUserLocationController(new UserLocationController());
            // No. usuarios
            if (getLogUser() != null) {
                // Se verifica y almacena el número mayor de registro par locación asociado al usuario
                int maxNumUsuarios = 0;
                int maxNumProyectos = 0;
                int maxNumLotes = 0;
                List<UserLocation> userLocation = getUserLocationController().fillAllUserLocationByUser(getLogUser());

                //carga los datos para valida el paquete
                setUserNoLocaciones(userLocation.size());
                setUserNoUsuarios(maxNumUsuarios);
                setUserNoProyectos(maxNumProyectos);
                setUserNoLotes(maxNumLotes);
                // se cargan las tarjetas registradas
                String privateKey = "sk_6310ee6c56c842a892b238eb3fc31eda";
                String merchantId = "m1al82yn7h3mdonrkdfe";
                OpenpayAPI api = new OpenpayAPI("https://sandbox-api.openpay.mx", privateKey, merchantId);
                try {
                    // busco al UserOpenPay
                    setUserOpenPayController(new UserOpenPayController());
                    UserOpenPay userOp = getUserOpenPayController().fillUserOpenPayByUser(getLogUser());
                    if (userOp != null) {
                        //tagetas
                        SearchParams request = new SearchParams();
                        request.offset(0);
                        request.limit(100);
                        setCardsOpenPay(api.cards().list(userOp.getIdClienteOpenPay(), request));
                    }
                } catch (OpenpayServiceException | ServiceUnavailableException e) {
                    logger.error("Error al cargar las tarjetas" + e);
                }
                // se cargan los paquetes
                setNumeroPaks("1");
                setClaveValidada(true);
                showMessage(FacesMessage.SEVERITY_INFO, "Correo verificado", "El correo fue verificado correctamente");
                logger.info("Correo verificado correctamente");
            } else {
                showMessage(FacesMessage.SEVERITY_ERROR, "Error", "Error al identificar el usuario");
            }
        } else {
            showMessage(FacesMessage.SEVERITY_ERROR, "Error al verificar el correo", "Clave de verificación incorrecta");
            logger.error("Clave de verificación incorrecta");
        }
    }

    private boolean setCheckEmail(String mail, String clave) {
        logger.info("setCheckEmail");
        String ACCESS_KEY = getBundlePropertyFile().getString("aws.access.key");
        String SECRET_KEY = getBundlePropertyFile().getString("aws.secret.access.key");

        // Remitente y destinatario
        String sender = "soporte@crovonline.com";
        String recipient = mail;

        // Configurar credenciales de AWS
        BasicAWSCredentials awsCredentials = new BasicAWSCredentials(ACCESS_KEY, SECRET_KEY);
        AmazonSimpleEmailService client = AmazonSimpleEmailServiceClientBuilder.standard()
                .withCredentials(new AWSStaticCredentialsProvider(awsCredentials))
                .withRegion(getBundlePropertyFile().getString("aws.region")) // Cambia la región según tus necesidades
                .build();

        String SUBJECT = "Código de verificación para CROV Inmobiliaria";

        String HTMLBODY = "<h1>Verificación de Correo Electrónico CROV Inmobiliaria</h1>"
                + "<p>Código de Verificación: " + clave + "</p>";

        String TEXTBODY = "Este mensaje ha sido enviado automáticamente desde CROV Inmobiliaria.\n\n";

        // Crear el mensaje
        SendEmailRequest request = new SendEmailRequest()
                .withDestination(new Destination().withToAddresses(recipient))
                .withMessage(new Message()
                        .withBody(new Body()
                                .withHtml(new Content()
                                        .withCharset("UTF-8").withData(HTMLBODY))
                                .withText(new Content()
                                        .withCharset("UTF-8").withData(TEXTBODY)))
                        .withSubject(new Content()
                                .withCharset("UTF-8").withData(SUBJECT)))
                .withSource(sender);

        // Enviar el correo
        try {
            SendEmailResult result = client.sendEmail(request);
            showMessage(FacesMessage.SEVERITY_INFO, "El correo se ha enviado correctamente", "El correo se ha enviado correctamente");
            logger.info("El correo se ha enviado correctamente. ID del mensaje: " + result.getMessageId());
            return true;
        } catch (AmazonServiceException ex) {
            showMessage(FacesMessage.SEVERITY_ERROR, "Error al enviar el correo", "Error al enviar el correo");
            logger.error("Error al enviar el correo: " + ex.getMessage());
            return false;
        }
    }

    public void valTipoPago() {
        if (getNewTargeta()) {
            if (getCardTitular() != null && !"".equals(getCardTitular()) && getCardTarjeta() != null && !"".equals(getCardTarjeta())
                    && getCardDireccionCiudad() != null && !"".equals(getCardDireccionCiudad()) && getCardDireccionEstado() != null && !"".equals(getCardDireccionEstado())
                    && getCardDireccionCalle() != null && !"".equals(getCardDireccionCalle()) && getCardDireccionCodigoPostal() != null && !"".equals(getCardDireccionCodigoPostal())
                    && getCardDireccionNumero() != null && !"".equals(getCardDireccionNumero()) && getCardExpiracionMes() != null && getCardExpiracionAno() != null
                    && getCardDigitos() != null && !"".equals(getCardDigitos())) {
                renobarPaquete();
            } else {
                setNewTargeta(false);
                showMessage(FacesMessage.SEVERITY_ERROR, "Error", "Debe de completar los datos de la tarjeta para pagar con otra que no tenga registrada");
            }
        } else {
            if (getSelectedTargeta() != null && !getSelectedTargeta().isEmpty()) {
                renobarPaquete();
            } else {
                showMessage(FacesMessage.SEVERITY_ERROR, "Error", "Debe de seleccionar una tejera existente o registrar una nueva para realizar la compra");
            }
        }
    }

    public void renobarPaquete() {
        logger.info("comprarPaquete");
        String privateKey = "sk_6310ee6c56c842a892b238eb3fc31eda";
        String merchantId = "m1al82yn7h3mdonrkdfe";
        OpenpayAPI api = new OpenpayAPI("https://sandbox-api.openpay.mx", privateKey, merchantId);
        Customer customer = new Customer();
        try {
            if (getComprandoPack() == false) {
                setComprandoPack(true);
                logger.info("Empezando con la compra el paquete");
                // se valida el numero paquetes que se compraran
                Integer numeroDePaquetes = 1;
                switch (getNumeroPaks()) {
                    case "1":
                        numeroDePaquetes = 1;
                        break;
                    case "3":
                        numeroDePaquetes = 3;
                        break;
                    case "6":
                        numeroDePaquetes = 6;
                        break;
                    case "12":
                        numeroDePaquetes = 12;
                        break;
                    default:
                        numeroDePaquetes = 1;
                }
                // busco al UserOpenPay
                setUserOpenPayController(new UserOpenPayController());
                UserOpenPay userOp = getUserOpenPayController().fillUserOpenPayByUser(getLogUser());
                // se valida si el usuario ya tiene un usuario en OpenPay
                Customer newcustomer = new Customer();
                if (userOp == null) {
                    logger.info("Creando address OpenPay");
                    Address address = new Address();
                    address.city(getCardDireccionCiudad());
                    address.countryCode("MX");
                    address.state(getCardDireccionEstado());
                    address.postalCode(getCardDireccionCodigoPostal());
                    address.line1(getCardDireccionCalle());
                    logger.info("Creando customer OpenPay");

                    String nombres;
                    if (getLogUser().getPerson().getSecondName() != null || !getLogUser().getPerson().getSecondName().isEmpty()) {
                        nombres = getLogUser().getPerson().getFirstName() + " " + getLogUser().getPerson().getSecondName();
                    } else {
                        nombres = getLogUser().getPerson().getFirstName();
                    }
                    String apellidos = getLogUser().getPerson().getLastName() + " " + getLogUser().getPerson().getMiddleName();

                    newcustomer.name(nombres);
                    newcustomer.lastName(apellidos);
                    newcustomer.email(getLogUser().getPerson().getMail());
                    newcustomer.phoneNumber(getCardDireccionNumero());
                    newcustomer.requiresAccount(false);
                    newcustomer.address(address);
                    newcustomer = api.customers().create(newcustomer);
                }
                // se valida si se eligio una tergeta existente o una nueva para el pago
                Card newCard = new Card();
                if (getNewTargeta()) {
                    //cargando customer
                    Customer cus;
                    // Se valida si no se encontraron datos del usuario de OP
                    if (userOp == null) {
                        cus = newcustomer;
                    } else {
                        cus = api.customers().get(userOp.getIdClienteOpenPay());
                    }
                    logger.info("Creando card OpenPay");
                    newCard.holderName(getCardTitular());
                    newCard.cardNumber(getCardTarjeta());
                    newCard.cvv2(getCardDigitos());
                    newCard.expirationMonth(getCardExpiracionMes());
                    newCard.expirationYear(getCardExpiracionAno());
                    newCard.setDeviceSessionId(getDeviceSessionId());
                    newCard.address(cus.getAddress());
                    newCard = api.cards().create(cus.getId(), newCard);
                }

                // Si el UserOpenPay fue null creo un nuevo registro en el sistema con los datos de correspondientes de OpenPay
                if (userOp == null) {
                    logger.info("Creado un nuevo registro en UserOpenPay");
                    UserOpenPay usOpenPay = new UserOpenPay();
                    usOpenPay.setUser(getLogUser());
                    usOpenPay.setIdClienteOpenPay(newcustomer.getId());
                    usOpenPay.setIdTargetaOpenPay(newCard.getId());
                    usOpenPay.setEstatusActivo(GenericEnumType.ENABLED);
                    getUserOpenPayController().addUserOpenPay(usOpenPay, new User("09ea84b8-b9d1-4a71-adfe-db653b2a9982", ""), true);
                    userOp = usOpenPay;
                }

                logger.info("Realizando cargo al cliente OpenPay");
                CreateCardChargeParams request = new CreateCardChargeParams();
                String orderId = UUID.randomUUID().toString();
                request.orderId(orderId); // =opcional DEBE DE SER UNICO
                // se valida si se eligio una tergeta existente o una nueva para el pago
                if (getNewTargeta()) {
                    request.cardId(newCard.getId()); // =source_id   
                } else {
                    request.cardId(userOp.getIdTargetaOpenPay()); // =source_id   
                }

                Double costo = getSelectPaquete().getCosto() * numeroDePaquetes.doubleValue();
                BigDecimal monto = new BigDecimal(costo).setScale(2, RoundingMode.HALF_UP);
                request.amount(monto);

                request.currency("MXN");
                request.description("Compra de paquete " + getSelectPaquete().getNombre());
                request.deviceSessionId(getDeviceSessionId());
                Charge charge = api.charges().create(userOp.getIdClienteOpenPay(), request);
                logger.info("Pago realizado correctamente");

                setUserLocationController(new UserLocationController());
                List<UserLocation> userLocation = getUserLocationController().fillAllUserLocationByUser(getLogUser());

                for (UserLocation usLo : userLocation) {
                    // se carga la lista de paquetes 

                    // Se crea un nuevo registro para vincular paquetes con lotes
                    LocationPaquetes newLocationPaquetes = new LocationPaquetes();
                    newLocationPaquetes.setPaquete(getSelectPaquete());
                    newLocationPaquetes.setLocation(usLo.getLocation());

                    // se valida si ahí un paquete activo para definir la fecha de único del nuevo paquete a partir de la fecha de finalización de primer paquete

                    newLocationPaquetes.setNombrePaquete(getSelectPaquete().getNombre());
                    newLocationPaquetes.setCostoPaquete(getSelectPaquete().getCosto() * numeroDePaquetes);
                    newLocationPaquetes.setEstatusActivo(GenericEnumType.ENABLED);
                    newLocationPaquetes.setLicencia(UUID.randomUUID().toString());
                    newLocationPaquetes.setOpenPayOrderId(orderId);

                }
                resetFormPay();
                showMessage(FacesMessage.SEVERITY_INFO, "Paquete actualizado", "El paquete se actualizó correctamente ");
            } else {
                logger.error("Compra del paquete en proceso");
            }
        } catch (OpenpayServiceException | ServiceUnavailableException e) {
            // Se elimina el cliente que se acababa de crear por error en la transacción
            try {
                api.customers().delete(customer.getId());
                logger.error("customer eliminado por error en la transacción");
            } catch (OpenpayServiceException | ServiceUnavailableException e2) {
                logger.error("Error al eliminar customer por error en la transacción" + e2);
            }
            setComprandoPack(false);
            String errorDescription = null;
            String errorCode = null;
            if (e instanceof OpenpayServiceException) {
                OpenpayServiceException openpayException = (OpenpayServiceException) e;
                errorDescription = openpayException.getDescription();
                errorCode = openpayException.getErrorCode().toString();
            }
            showMessage(FacesMessage.SEVERITY_ERROR, "Error " + errorCode, errorDescription);
            logger.error("Error openpay: " + e);
        }
    }

    public Boolean renobarPaqueteAutomático(User userR) {
        logger.info("renobarPaqueteAutomático");
        String privateKey = "sk_6310ee6c56c842a892b238eb3fc31eda";
        String merchantId = "m1al82yn7h3mdonrkdfe";
        OpenpayAPI api = new OpenpayAPI("https://sandbox-api.openpay.mx", privateKey, merchantId);
        try {
            logger.info("Empezando con la compra el paquete automática");
            // busco al UserOpenPay
            setUserOpenPayController(new UserOpenPayController());
            UserOpenPay userOp = getUserOpenPayController().fillUserOpenPayByUser(userR);
            // se carga la lista de paquetes 
       

            logger.info("Realizando cargo al cliente OpenPay");
            CreateCardChargeParams request = new CreateCardChargeParams();
            String orderId = UUID.randomUUID().toString();
            request.orderId(orderId); // =opcional DEBE DE SER UNICO
            // se valida si se eligio una tergeta existente o una nueva para el pago
            request.cardId(userOp.getIdTargetaOpenPay()); // =source_id  

            Double costo = getSelectPaquete().getCosto();
            BigDecimal monto = new BigDecimal(costo).setScale(2, RoundingMode.HALF_UP);
            request.amount(monto);

            request.currency("MXN");
            request.deviceSessionId(getDeviceSessionId());
            api.charges().create(userOp.getIdClienteOpenPay(), request);
            logger.info("Pago realizado correctamente");

            setUserLocationController(new UserLocationController());
            List<UserLocation> userLocation = getUserLocationController().fillAllUserLocationByUser(userR);

            return true;
        } catch (OpenpayServiceException | ServiceUnavailableException e) {

            String errorDescription = null;
            String errorCode = null;
            if (e instanceof OpenpayServiceException) {
                OpenpayServiceException openpayException = (OpenpayServiceException) e;
                errorDescription = openpayException.getDescription();
                errorCode = openpayException.getErrorCode().toString();
            }
            showMessage(FacesMessage.SEVERITY_ERROR, "Error " + errorCode, errorDescription);
            logger.error("Error openpay: " + e);
            return false;
        }
    }

    private Date fechaMasDias(Date fecha, Integer dias) {
        // Convertir la fecha proporcionada a un objeto ZonedDateTime
        ZonedDateTime zonedDateTime = fecha.toInstant().atZone(ZoneId.systemDefault());
        // Sumar los días al objeto ZonedDateTime
        ZonedDateTime nuevaFecha = zonedDateTime.plusDays(dias);
        // Convertir el resultado nuevamente a un objeto Date
        return Date.from(nuevaFecha.toInstant());
    }

    public void validarNewTargeta() {
        if (getNewTargeta() == false) {
            setNewTargeta(true);
        } else {
            setNewTargeta(false);
        }
        logger.info("Nueva tarjeta " + getNewTargeta());
    }

    public void resetFormPay() {
        setRenobarPack(false);
        setMailVal(null);
        setPasswordVal(null);
        setClaveValidada(false);
        setEnviandoCorreo(false);
        setCardsOpenPay(null);
        setSelectedTargeta(null);
        setCardTitular(null);
        setCardTarjeta(null);
        setCardDireccionCiudad(null);
        setCardDireccionEstado(null);
        setCardDireccionCalle(null);
        setCardDireccionCodigoPostal(null);
        setCardDireccionNumero(null);
        setCardExpiracionMes(null);
        setCardExpiracionAno(null);
        setCardDigitos(null);
    }

    /**
     * Class contants.
     */
    private static final long serialVersionUID = -6130715794722525144L;

    private static final String LOGIN = "/dashboard.jsf";

    final Logger logger = LogManager.getLogger(LoginBean.class);

    /**
     * Class variables.
     */
    private String forwardUrl;
    private String password;
    private String username;
    private Boolean paqueteActivo;
    private UserController userController;

    private UserLocationController userLocationController;
    private UserOpenPayController userOpenPayController;

    private String mailVal;
    private String passwordVal;
    private Boolean enviandoCorreo;
    private Boolean comprandoPack;
    private String claveEnviada;
    private String claveIngresada;
    private Boolean claveValidada;
    private List<Paquetes> ListPaquetes;
    private Paquetes selectPaquete;
    private String numeroPaks;

    private String cardDireccionCalle;
    private String cardDireccionNumero;
    private String cardDireccionCiudad;
    private String cardDireccionCodigoPostal;
    private String cardDireccionEstado;
    private String cardNumeroTelefono;
    private List<Card> cardsOpenPay;
    private String selectedTargeta;
    private Boolean newTargeta;

    private String cardTitular;
    private String cardTarjeta;
    private Integer cardExpiracionMes;
    private Integer cardExpiracionAno;
    private String cardDigitos;
    private String deviceSessionId;
    private String sourceId;
    private User logUser;

    private Integer UserNoLocaciones;
    private Integer UserNoUsuarios;
    private Integer UserNoProyectos;
    private Integer UserNoLotes;

    private Boolean renobarPack;
    private Boolean required;
    
    private String imagen;

    /**
     * Contructors and pre/post contructors.
     */
    @PostConstruct
    public void init() {
        loadBundlePropertyFile();
        this.forwardUrl = extractRequestedUrlBeforeLogin();
        setPaqueteActivo(true);
        setClaveValidada(false);
        setComprandoPack(false);
        setNewTargeta(false);
        setEnviandoCorreo(false);
        setClaveEnviada(null);
        setClaveIngresada(null);
        setRenobarPack(false);
        setRequired(true);
        setNumeroPaks("1");
        
        //String link = externalContext().getRequestContextPath();
        String host = externalContext().getRequestServerName();
        switch (host) {
            case "www.tuinmobiliariacrov.com":
                setImagen("images/prase_logo.jpeg");
                break;
            case "camposjimenez.tuinmobiliariacrov.com":
                setImagen("imagesprase_logo.jpeg");
                break;
            case "localhost":
                setImagen("images/prase_logo.jpeg");
                break;
            default:
                setImagen("images/prase_logo.jpeg");
        }
                
    }

    /**
     * Getters and Setters.
     *
     * @return
     */
    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = new CarDriverSecurity(APP, password).getPassword();
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Boolean getPaqueteActivo() {
        return paqueteActivo;
    }

    public void setPaqueteActivo(Boolean paqueteActivo) {
        this.paqueteActivo = paqueteActivo;
    }

    public UserController getUserController() {
        return userController;
    }

    public void setUserController(UserController userController) {
        this.userController = userController;
    }

    public String getForwardUrl() {
        return forwardUrl;
    }

    public void setForwardUrl(String forwardUrl) {
        this.forwardUrl = forwardUrl;
    }

    public String getMailVal() {
        return mailVal;
    }

    public void setMailVal(String mailVal) {
        this.mailVal = mailVal;
    }

    public String getPasswordVal() {
        return passwordVal;
    }

    public void setPasswordVal(String passwordVal) {
        this.passwordVal = passwordVal;
    }

    public Boolean getEnviandoCorreo() {
        return enviandoCorreo;
    }

    public void setEnviandoCorreo(Boolean enviandoCorreo) {
        this.enviandoCorreo = enviandoCorreo;
    }

    public String getClaveEnviada() {
        return claveEnviada;
    }

    public void setClaveEnviada(String claveEnviada) {
        this.claveEnviada = claveEnviada;
    }

    public String getClaveIngresada() {
        return claveIngresada;
    }

    public void setClaveIngresada(String claveIngresada) {
        this.claveIngresada = claveIngresada;
    }

    public Boolean getClaveValidada() {
        return claveValidada;
    }

    public void setClaveValidada(Boolean claveValidada) {
        this.claveValidada = claveValidada;
    }

    public List<Paquetes> getListPaquetes() {
        return ListPaquetes;
    }

    public void setListPaquetes(List<Paquetes> ListPaquetes) {
        this.ListPaquetes = ListPaquetes;
    }

    public Paquetes getSelectPaquete() {
        return selectPaquete;
    }

    public void setSelectPaquete(Paquetes selectPaquete) {
        this.selectPaquete = selectPaquete;
    }

    public String getNumeroPaks() {
        return numeroPaks;
    }

    public void setNumeroPaks(String numeroPaks) {
        this.numeroPaks = numeroPaks;
    }

    public String getCardDireccionCalle() {
        return cardDireccionCalle;
    }

    public void setCardDireccionCalle(String cardDireccionCalle) {
        this.cardDireccionCalle = cardDireccionCalle;
    }

    public String getCardDireccionNumero() {
        return cardDireccionNumero;
    }

    public void setCardDireccionNumero(String cardDireccionNumero) {
        this.cardDireccionNumero = cardDireccionNumero;
    }

    public String getCardDireccionCiudad() {
        return cardDireccionCiudad;
    }

    public void setCardDireccionCiudad(String cardDireccionCiudad) {
        this.cardDireccionCiudad = cardDireccionCiudad;
    }

    public String getCardDireccionCodigoPostal() {
        return cardDireccionCodigoPostal;
    }

    public void setCardDireccionCodigoPostal(String cardDireccionCodigoPostal) {
        this.cardDireccionCodigoPostal = cardDireccionCodigoPostal;
    }

    public String getCardDireccionEstado() {
        return cardDireccionEstado;
    }

    public void setCardDireccionEstado(String cardDireccionEstado) {
        this.cardDireccionEstado = cardDireccionEstado;
    }

    public String getCardNumeroTelefono() {
        return cardNumeroTelefono;
    }

    public void setCardNumeroTelefono(String cardNumeroTelefono) {
        this.cardNumeroTelefono = cardNumeroTelefono;
    }

    public String getCardTitular() {
        return cardTitular;
    }

    public void setCardTitular(String cardTitular) {
        this.cardTitular = cardTitular;
    }

    public String getCardTarjeta() {
        return cardTarjeta;
    }

    public void setCardTarjeta(String cardTarjeta) {
        this.cardTarjeta = cardTarjeta;
    }

    public Integer getCardExpiracionMes() {
        return cardExpiracionMes;
    }

    public void setCardExpiracionMes(Integer cardExpiracionMes) {
        this.cardExpiracionMes = cardExpiracionMes;
    }

    public Integer getCardExpiracionAno() {
        return cardExpiracionAno;
    }

    public void setCardExpiracionAno(Integer cardExpiracionAno) {
        this.cardExpiracionAno = cardExpiracionAno;
    }

    public String getCardDigitos() {
        return cardDigitos;
    }

    public void setCardDigitos(String cardDigitos) {
        this.cardDigitos = cardDigitos;
    }

    public String getDeviceSessionId() {
        return deviceSessionId;
    }

    public void setDeviceSessionId(String deviceSessionId) {
        this.deviceSessionId = deviceSessionId;
    }

    public String getSourceId() {
        return sourceId;
    }

    public void setSourceId(String sourceId) {
        this.sourceId = sourceId;
    }

    public Integer getUserNoLocaciones() {
        return UserNoLocaciones;
    }

    public void setUserNoLocaciones(Integer UserNoLocaciones) {
        this.UserNoLocaciones = UserNoLocaciones;
    }

    public Integer getUserNoUsuarios() {
        return UserNoUsuarios;
    }

    public void setUserNoUsuarios(Integer UserNoUsuarios) {
        this.UserNoUsuarios = UserNoUsuarios;
    }

    public Integer getUserNoProyectos() {
        return UserNoProyectos;
    }

    public void setUserNoProyectos(Integer UserNoProyectos) {
        this.UserNoProyectos = UserNoProyectos;
    }

    public Integer getUserNoLotes() {
        return UserNoLotes;
    }

    public void setUserNoLotes(Integer UserNoLotes) {
        this.UserNoLotes = UserNoLotes;
    }


    public UserLocationController getUserLocationController() {
        return userLocationController;
    }

    public void setUserLocationController(UserLocationController userLocationController) {
        this.userLocationController = userLocationController;
    }

    public Boolean getComprandoPack() {
        return comprandoPack;
    }

    public void setComprandoPack(Boolean comprandoPack) {
        this.comprandoPack = comprandoPack;
    }

    public UserOpenPayController getUserOpenPayController() {
        return userOpenPayController;
    }

    public void setUserOpenPayController(UserOpenPayController userOpenPayController) {
        this.userOpenPayController = userOpenPayController;
    }

    public User getLogUser() {
        return logUser;
    }

    public void setLogUser(User logUser) {
        this.logUser = logUser;
    }

    public List<Card> getCardsOpenPay() {
        return cardsOpenPay;
    }

    public void setCardsOpenPay(List<Card> cardsOpenPay) {
        this.cardsOpenPay = cardsOpenPay;
    }

    public Boolean getNewTargeta() {
        return newTargeta;
    }

    public void setNewTargeta(Boolean newTargeta) {
        this.newTargeta = newTargeta;
    }

    public String getSelectedTargeta() {
        return selectedTargeta;
    }

    public void setSelectedTargeta(String selectedTargeta) {
        this.selectedTargeta = selectedTargeta;
    }

    public Boolean getRenobarPack() {
        return renobarPack;
    }

    public void setRenobarPack(Boolean renobarPack) {
        this.renobarPack = renobarPack;
    }

    public Boolean getRequired() {
        return required;
    }

    public void setRequired(Boolean required) {
        this.required = required;
    }

    public String getImagen() {
        return imagen;
    }

    public void setImagen(String imagen) {
        this.imagen = imagen;
    }

}
