/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.arrebol.taxiservicios.beans.spa;

import com.arrebol.taxiservicios.beans.TaxiGenericBean;
import com.arrebol.taxiservicios.controller.spa.CatalogoProductosController;
import com.arrebol.taxiservicios.model.enums.GenericEnumType;
import com.arrebol.taxiservicios.model.enums.TipoProductoSpa;
import com.arrebol.taxiservicios.model.spa.CatalogoProductos;
import java.io.Serializable;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.view.ViewScoped;
import javax.inject.Named;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

/**
 *
 * @author Crov
 */
@Named("catalogoProductosBean")
@ViewScoped
public class CatalogoProductosBean extends TaxiGenericBean implements Serializable {

    private static final long serialVersionUID = -7284027390656669184L;
    final Logger logger = LogManager.getLogger(getClass());

    private CatalogoProductosController catalogoProductosController;

    private List<CatalogoProductos> listCatalogoProductos;
    private CatalogoProductos selectProducto;
    private String tipoProducto;
    private String descripcion;
    private Double costo;

    @PostConstruct
    public void init() {
        logger.info("Start  init()");
        try {
            setCatalogoProductosController(new CatalogoProductosController());
            setListCatalogoProductos(getCatalogoProductosController().fillCatalogoProductosByLocation(getLoggedUser().getLocation()));
        } catch (Exception e) {
            logger.error("init(): ", e);
        }
    }

    public void addProducto() {
        logger.info("addProducto");
        try {
            setCatalogoProductosController(new CatalogoProductosController());
            // se valida el tipo de producto seleccionado
            CatalogoProductos producto = new CatalogoProductos();
            switch (getTipoProducto()) {
                case "PRODUCTO":
                    producto.setTipo(TipoProductoSpa.PRODUCTO);
                    break;
                case "SERVICIO":
                    producto.setTipo(TipoProductoSpa.SERVICIO);
                    break;
                case "PAQUETE":
                    producto.setTipo(TipoProductoSpa.PAQUETE);
                    break;
                default:
                    showMessage(FacesMessage.SEVERITY_WARN, "Error", "No se seleccionó tipo de producto válido ");
                    return;
            }
            producto.setDescripcion(getDescripcion());
            producto.setCosto(getCosto());
            producto.setEstatusActivo(GenericEnumType.ENABLED);
            producto.setLocation(getLoggedUser().getLocation());
            getCatalogoProductosController().addCatalogoProductos(producto, getLoggedUser(), true);
            getListCatalogoProductos().add(producto);
            clearSelected();
            showMessage(FacesMessage.SEVERITY_INFO, "Producto agregado", "El producto se agregó correctamente");
        } catch (Exception e) {
            showMessage(FacesMessage.SEVERITY_ERROR, "Error", "Ocurrió un error al agregar el producto");
            logger.error("addProducto(): " + e);
        }
    }

    public void updateProducto() {
        logger.info("addProducto");
        try {
            setCatalogoProductosController(new CatalogoProductosController());
            // se valida el tipo de producto seleccionado
            switch (getTipoProducto()) {
                case "PRODUCTO":
                    getSelectProducto().setTipo(TipoProductoSpa.PRODUCTO);
                    break;
                case "SERVICIO":
                    getSelectProducto().setTipo(TipoProductoSpa.SERVICIO);
                    break;
                case "PAQUETE":
                    getSelectProducto().setTipo(TipoProductoSpa.PAQUETE);
                    break;
                default:
                    showMessage(FacesMessage.SEVERITY_WARN, "Error", "No se seleccionó tipo de producto válido ");
                    return;
            }
            getSelectProducto().setDescripcion(getDescripcion());
            getSelectProducto().setCosto(getCosto());
            getSelectProducto().setEstatusActivo(GenericEnumType.ENABLED);
            getCatalogoProductosController().addCatalogoProductos(getSelectProducto(), getLoggedUser(), false);
            
            // se actualiza la lista de productos
            setListCatalogoProductos(getCatalogoProductosController().fillCatalogoProductosByLocation(getLoggedUser().getLocation()));            
            clearSelected();
            
            showMessage(FacesMessage.SEVERITY_INFO, "Producto actualizado", "El producto se actualizo correctamente");
        } catch (Exception e) {
            showMessage(FacesMessage.SEVERITY_ERROR, "Error", "Ocurrió un error al agregar el producto");
            logger.error("addProducto(): " + e);
        }
    }

    public void updatedForm() {
        logger.info("updatedForm");
        setTipoProducto(getSelectProducto().getTipo().name());
        setDescripcion(getSelectProducto().getDescripcion());
        setCosto(getSelectProducto().getCosto());
    }

    public void deleteProductoPredefinido() {
        logger.info("deleteProductoPredefinido");
        try {
            getSelectProducto().setEstatusActivo(GenericEnumType.DISABLED);
            getCatalogoProductosController().addCatalogoProductos(getSelectProducto(), getLoggedUser(), false);
            showMessage(FacesMessage.SEVERITY_INFO, "Producto eliminado", "El producto se elimino correctamente");
             // se actualiza la lista de productos
            getListCatalogoProductos().remove(getSelectProducto());
            clearSelected();
        } catch (Exception e) {
            showMessage(FacesMessage.SEVERITY_FATAL, "Error", "Ocurrió un error al eliminar él producto  ");
            logger.error("deleteProductoPredefinido(): " + e);
        }
    }

    public void clearSelected() {
        setSelectProducto(null);
        setTipoProducto(null);
        setDescripcion(null);
        setCosto(null);
    }

    public List<CatalogoProductos> getListCatalogoProductos() {
        return listCatalogoProductos;
    }

    public void setListCatalogoProductos(List<CatalogoProductos> listCatalogoProductos) {
        this.listCatalogoProductos = listCatalogoProductos;
    }

    public CatalogoProductos getSelectProducto() {
        return selectProducto;
    }

    public void setSelectProducto(CatalogoProductos selectProducto) {
        this.selectProducto = selectProducto;
    }

    public String getTipoProducto() {
        return tipoProducto;
    }

    public void setTipoProducto(String tipoProducto) {
        this.tipoProducto = tipoProducto;
    }

    public CatalogoProductosController getCatalogoProductosController() {
        return catalogoProductosController;
    }

    public void setCatalogoProductosController(CatalogoProductosController catalogoProductosController) {
        this.catalogoProductosController = catalogoProductosController;
    }

    public String getDescripcion() {
        return descripcion;
    }

    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }

    public Double getCosto() {
        return costo;
    }

    public void setCosto(Double costo) {
        this.costo = costo;
    }

}
