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

import com.arrebol.taxiservicios.beans.Datatable;
import com.arrebol.taxiservicios.beans.TaxiGenericBean;
import com.arrebol.taxiservicios.controller.admin.GenericValidationController;
import com.arrebol.taxiservicios.model.enums.GenericEnumType;
import com.crov.prase.controller.catalog.DespachoController;
import com.crov.prase.model.catalog.Despacho;
import com.crov.prase.model.catalog.TipoRiesgo;
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;
import org.primefaces.event.ReorderEvent;
import org.primefaces.event.RowEditEvent;

/**
 *
 * @author Crov
 */
@Named("despachoBean")
@ViewScoped
public class DespachoBean extends TaxiGenericBean implements Serializable, Datatable {

    private static final long serialVersionUID = -136031528440947006L;
    final Logger logger = LogManager.getLogger(TipoSiniestroBean.class);

    private DespachoController despachoController;
    private GenericValidationController genericController;
    private List<Despacho> listDespacho;
    private Despacho selectedDespacho;

    private String nombreComercial;
    private String propietarioContacto;
    private String telefono;
    private String direccion;

    @PostConstruct
    public void init() {
        logger.info("init");
        try {
            loadBundlePropertyFile();
            setDespachoController(new DespachoController());
            cargarListDespachos();
        } catch (Exception e) {
            logger.error(e);
        }
    }

    private void cargarListDespachos() {
        logger.info("cargarListDespachos()");
        try {
            setListDespacho(getDespachoController().fillDespachoByLocation(getLoggedUser().getLocation()));
        } catch (Exception e) {
            logger.error("cargarListDespachos() " + e);
        }
    }

    @Override
    public void editRow(RowEditEvent event) {
        logger.info("editRow");
        try {
            Despacho despacho = (Despacho) event.getObject();
            if (despacho != null) {
                getDespachoController().addDespacho(despacho, getLoggedUser(), false);
                cargarListDespachos();
                logger.info("Despacho actualizado correctamente ");
                showMessage(FacesMessage.SEVERITY_INFO, "Despacho actualizado", "Despacho actualizado correctamente");
            } else {
                logger.error("Ocurrió un error al actualizar el tipo de riesgo");
                showMessage(FacesMessage.SEVERITY_ERROR, "Error", "Ocurrió un error al actualizar el tipo de riesgo");
            }
        } catch (Exception e) {
            showMessage(FacesMessage.SEVERITY_FATAL, "Error", "Ocurrió un error al actualizar el tipo de riesgo");
            logger.error("editRow()" + e);
        }
    }

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

    @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() {
        logger.info("addRow");
        try {
            Despacho tabla = new Despacho();
            tabla.setEstatusActivo(GenericEnumType.ENABLED);
            tabla.setLocation(getLoggedUser().getLocation());
            tabla.setNombreComercial(getNombreComercial());
            tabla.setPropietarioContacto(getPropietarioContacto());
            tabla.setTelefono(getTelefono());
            tabla.setDireccion(getDireccion());
            getDespachoController().addDespacho(tabla, getLoggedUser(), true);
            getListDespacho().add(tabla);
            logger.info("Despacho agregado correctamente ");
            showMessage(FacesMessage.SEVERITY_INFO, "Despacho agregado", "Despacho agregado correctamente");
        } catch (Exception e) {
            showMessage(FacesMessage.SEVERITY_ERROR, "Error", "Ocurrió un error al agregar el tipo de riesgo");
            logger.error("addRow() " + e);
        }
    }

    @Override
    public void deleteRow() {
        logger.info("deleteRow");
        try {
            getSelectedDespacho().setEstatusActivo(GenericEnumType.DISABLED);
            getDespachoController().addDespacho(getSelectedDespacho(), getLoggedUser(), false);
            getListDespacho().remove(getSelectedDespacho());
            setSelectedDespacho(null);
            cargarListDespachos();
            logger.info("Despacho eliminado correctamente ");
            showMessage(FacesMessage.SEVERITY_INFO, "Despacho eliminado", "Despacho eliminado correctamente");
        } catch (Exception e) {
            showMessage(FacesMessage.SEVERITY_ERROR, "Error", "Ocurrió un error al eliminar el tipo de riesgo");
            logger.error("deleteRow()" + e);
        }
    }

    public DespachoController getDespachoController() {
        return despachoController;
    }

    public void setDespachoController(DespachoController despachoController) {
        this.despachoController = despachoController;
    }

    public GenericValidationController getGenericController() {
        return genericController;
    }

    public void setGenericController(GenericValidationController genericController) {
        this.genericController = genericController;
    }

    public List<Despacho> getListDespacho() {
        return listDespacho;
    }

    public void setListDespacho(List<Despacho> listDespacho) {
        this.listDespacho = listDespacho;
    }

    public Despacho getSelectedDespacho() {
        return selectedDespacho;
    }

    public void setSelectedDespacho(Despacho selectedDespacho) {
        this.selectedDespacho = selectedDespacho;
    }

    public String getNombreComercial() {
        return nombreComercial;
    }

    public void setNombreComercial(String nombreComercial) {
        this.nombreComercial = nombreComercial;
    }

    public String getPropietarioContacto() {
        return propietarioContacto;
    }

    public void setPropietarioContacto(String propietarioContacto) {
        this.propietarioContacto = propietarioContacto;
    }

    public String getTelefono() {
        return telefono;
    }

    public void setTelefono(String telefono) {
        this.telefono = telefono;
    }

    public String getDireccion() {
        return direccion;
    }

    public void setDireccion(String direccion) {
        this.direccion = direccion;
    }

}
