/*
 * 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.catalog;

import com.arrebol.taxiservicios.beans.Datatable;
import com.arrebol.taxiservicios.beans.TaxiGenericBean;
import com.arrebol.taxiservicios.controller.catalog.ClaveProductoServicioController;
import com.arrebol.taxiservicios.controller.catalog.ClaveUnidadController;
import com.arrebol.taxiservicios.controller.catalog.ServiceController;
import com.arrebol.taxiservicios.model.admin.Service;
import com.arrebol.taxiservicios.model.catalog.ClaveProductoServicio;
import com.arrebol.taxiservicios.model.catalog.ClaveUnidad;
import com.arrebol.taxiservicios.model.enums.BasicType;
import java.io.Serializable;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.view.ViewScoped;
import javax.inject.Named;
import org.primefaces.event.ReorderEvent;
import org.primefaces.event.RowEditEvent;
import org.primefaces.event.SelectEvent;

/**
 *
 * @author oscarvargas
 */
@Named("serviceManager")
@ViewScoped
public class ServiceManager extends TaxiGenericBean implements Serializable, Datatable{
    
    @Override
    public void editRow(RowEditEvent event) {
        Service service = (Service) event.getObject();
        if (service != null) {
            serviceCtrl.saveService(service, getLoggedUser().getId());
            showMessage(FacesMessage.SEVERITY_INFO, "Registro Editado", "Se hizo el cambio correctamente.");
        }
    }

    @Override
    public void onRowCancel(RowEditEvent event) {
        showMessage(FacesMessage.SEVERITY_INFO, "Edición Cancelada", ((Service) event.getObject()).getName());
    }

    @Override
    public void onRowReorder(ReorderEvent event) {
        showMessage(FacesMessage.SEVERITY_INFO, "Registro Movido", "De columna: " + (event.getFromIndex() + 1) + " a columna: " + (event.getToIndex() + 1));
    }
    
    @Override
    public void addRow() {
        Service serviceObj = new Service();
        
        try{
            serviceObj.setId(getSelectedService().getId());
        }
        catch(Exception e){serviceObj = new Service();}
        
        serviceObj.setName(name);
        serviceObj.setCharge(charge);
        serviceObj.setDiscountFix(discountFix);
        serviceObj.setActive(Boolean.TRUE);
        serviceObj.setLocation(getLoggedUser().getLocation());
        serviceObj.setClaveUnidad(getClaveUnidad());
        serviceObj.setClaveProductoServicio(getClaveProductoServicio());
         
        serviceCtrl.saveService(serviceObj, getLoggedUser().getId());
        serviceCtrl.fillServiceDatatableByLocation(getLoggedUser().getLocation().getId());
        setClaveUnidad(null);
        setClaveProductoServicio(null);
        setIdClaveUnidad(null);
        setIdClaveProductoServicio(null);
        setSelectedService(null);
        setCharge(null);
        setDiscountFix(0);
        setName(null);
        
        FacesMessage msg = new FacesMessage("Nuevo Servicio", "Se agregó correctamente");
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }

    @Override
    public void deleteRow() {
        serviceCtrl.deleteService(selectedService);
        service.remove(selectedService);
        selectedService = null;
        showMessage(FacesMessage.SEVERITY_INFO, "Servicio Eliminado", "Se eliminó correctamente.");
    }
    
        public void onItemSelectClaveUnidad(SelectEvent event) {
        
        try {
            setClaveUnidad(claveUnidadController.getById(getIdClaveUnidad()));
        } catch (Exception e) {
            
            showMessage(FacesMessage.SEVERITY_FATAL,
                    getBundlePropertyFile().getString("garage.title"),
                    getBundlePropertyFile().getString("garage.generic.exception"));
        }
    }
    
    public void onItemSelectClaveProductoServicio(SelectEvent event) {
        
        try {
            setClaveProductoServicio(claveProductoServicioController.getById(getIdClaveProductoServicio()));
        } catch (Exception e) {
            
            showMessage(FacesMessage.SEVERITY_FATAL,
                    getBundlePropertyFile().getString("garage.title"),
                    getBundlePropertyFile().getString("garage.generic.exception"));
        }
    }
    
    public List<ClaveProductoServicio> searchClaveProductoServicios(String query) {
       

        List<ClaveProductoServicio> list = null;
        try {
            list = getClaveProductoServicioController().getClaveProductoServicioLike(query);
        } catch (Exception e) {
            
            showMessage(FacesMessage.SEVERITY_FATAL,
                    "No se pudo buscar la clave producto servicio",
                    "Error");
        }
        return list;
    }
    
     public List<ClaveUnidad> searchClaveUnidad(String query) {
       

        List<ClaveUnidad> list = null;
        try {
            list = getClaveUnidadController().getClaveUnidadLike(query);
        } catch (Exception e) {
            
            showMessage(FacesMessage.SEVERITY_FATAL,
                    "No se pudo buscar la clave producto servicio",
                    "Error");
        }
        return list;
    }
    
    public List<Service> getService() {
        return service;
    }

    public Service getSelectedService() {
        return selectedService;
    }

    public void setSelectedService(Service selectedService) {
        this.selectedService = selectedService;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    
    public Float getCharge() {
        return charge;
    }

    public void setCharge(Float charge) {
        this.charge = charge;
    }
    
    public int getDiscountFix() {
        return discountFix;
    }

    public void setDiscountFix(int discountFix) {
        this.discountFix = discountFix;
    }

    public String getIdClaveUnidad() {
        return idClaveUnidad;
    }

    public void setIdClaveUnidad(String idClaveUnidad) {
        this.idClaveUnidad = idClaveUnidad;
    }

    public ClaveUnidad getClaveUnidad() {
        return claveUnidad;
    }

    public void setClaveUnidad(ClaveUnidad claveUnidad) {
        this.claveUnidad = claveUnidad;
    }

    public String getIdClaveProductoServicio() {
        return idClaveProductoServicio;
    }

    public void setIdClaveProductoServicio(String idClaveProductoServicio) {
        this.idClaveProductoServicio = idClaveProductoServicio;
    }

    public ClaveProductoServicio getClaveProductoServicio() {
        return claveProductoServicio;
    }

    public void setClaveProductoServicio(ClaveProductoServicio claveProductoServicio) {
        this.claveProductoServicio = claveProductoServicio;
    }

    public ClaveUnidadController getClaveUnidadController() {
        return claveUnidadController;
    }

    public void setClaveUnidadController(ClaveUnidadController claveUnidadController) {
        this.claveUnidadController = claveUnidadController;
    }

    public ClaveProductoServicioController getClaveProductoServicioController() {
        return claveProductoServicioController;
    }

    public void setClaveProductoServicioController(ClaveProductoServicioController claveProductoServicioController) {
        this.claveProductoServicioController = claveProductoServicioController;
    }

    public ServiceController getServiceCtrl() {
        return serviceCtrl;
    }

    public void setServiceCtrl(ServiceController serviceCtrl) {
        this.serviceCtrl = serviceCtrl;
    }
    
    public void updateInfo() {
        
        setName(getSelectedService().getName());
        setCharge(getSelectedService().getCharge());
        setDiscountFix(getSelectedService().getDiscountFix());
  
        setClaveUnidad(getSelectedService().getClaveUnidad() != null ? getSelectedService().getClaveUnidad() : null);
        
        if (getClaveUnidad() != null) {
            setIdClaveUnidad(getClaveUnidad().toString());
        }
        
        setClaveProductoServicio(getSelectedService().getClaveProductoServicio() != null ? getSelectedService().getClaveProductoServicio() : null);
        
        if (getClaveProductoServicio() != null) {
            setIdClaveProductoServicio(getClaveProductoServicio().toString());
        }
     
        
    }
    
    @PostConstruct
    public void init() {
        serviceCtrl = new ServiceController();
        service = serviceCtrl.fillServiceDatatableByLocation(getLoggedUser().getLocation().getId());
        setClaveUnidadController(new ClaveUnidadController());
        setClaveProductoServicioController(new ClaveProductoServicioController());
    }
    
    private static final long serialVersionUID = -3721846411390582243L;
    
    private List<Service> service;
    private Service selectedService;

    private String id;
    private String name;
    private Float charge;
    private int discountFix;
    
     private String idClaveUnidad;
    private ClaveUnidad claveUnidad;
    private String idClaveProductoServicio;
    private ClaveProductoServicio claveProductoServicio;
    private ClaveUnidadController claveUnidadController;
    private ClaveProductoServicioController claveProductoServicioController;
    
    private ServiceController serviceCtrl;
    
}
