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

import com.arrebol.taxiservicios.beans.Datatable;
import com.arrebol.taxiservicios.beans.TaxiGenericBean;
import com.arrebol.taxiservicios.controller.admin.ClosingDayServiceImpl;
import com.crov.prase.controller.prase.PagosPolizaController;
import com.crov.prase.model.prase.SolicitudDevolucionDetellePagoPoliza;
import java.io.Serializable;
import java.util.Calendar;
import java.util.Date;
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 Oscar
 */
@Named("aprobarDevolucionDePagosBean")
@ViewScoped
public class AprobarDevolucionDePagosBean extends TaxiGenericBean implements Serializable, Datatable {

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

   private PagosPolizaController pagosPolizaController;

   private List<SolicitudDevolucionDetellePagoPoliza> listSolicitudes;
   private SolicitudDevolucionDetellePagoPoliza selectSolicitud;

   @PostConstruct
   public void init() {
      logger.info("init");
      try {
         loadTaxiPropertyFile();
         loadBundlePropertyFile();

         setPagosPolizaController(new PagosPolizaController());
         setSelectSolicitud(null);
         cargarSolicitudes();
      } catch (Exception e) {
         logger.error(e);
      }
   }

   public void cargarSolicitudes() {
      logger.info("cargarSolicitudes()");
      try {
         setListSolicitudes(getPagosPolizaController().fillSolicitudDevolucionDetellePagoPolizaByLocation(getLoggedUser().getLocation().getId()));
      } catch (Exception e) {
         logger.error("cargarSolicitudes(): " + e);
         showMessage(FacesMessage.SEVERITY_INFO, "Error", "Ocurrió un error al tratar de cargar la lista de solicitudes");
      }
   }

   public void rechazarSolicitud() {
      logger.info("rechazarSolicitud()");
      try {
         if (getPagosPolizaController().rechazarSolicitudDevolucionDetellePagoPoliza(getSelectSolicitud(), getLoggedUser())) {
            showMessage(FacesMessage.SEVERITY_INFO, "Solicitud rechazada", "Solicitud rechazada correctamente");
         } else {
            showMessage(FacesMessage.SEVERITY_ERROR, "Error", "Ocurrió un error al tratar de rechazar la solicitud");
         }
         cargarSolicitudes();
      } catch (Exception e) {
         showMessage(FacesMessage.SEVERITY_FATAL, "Error", "Ocurrió un error al tratar de rechazar la solicitud");
         logger.error("rechazarSolicitud(): " + e);
      }
   }

   public void aprobarSolcitud() {
      logger.info("aprobarSolcitud()");
      try {
         if (new ClosingDayServiceImpl().existClosingDayByCreatedOn(correcciónDeHr(new Date(), -7), getSelectSolicitud().getUsuarioCorte())) {
            showMessage(FacesMessage.SEVERITY_WARN, "Error", "El usuario al que afectará la devolución ya realizó su corte del día ");
            return;
         }
         if (getPagosPolizaController().aprobarSolicitudDevolucionDetellePagoPoliza(getSelectSolicitud(), getLoggedUser())) {
            showMessage(FacesMessage.SEVERITY_INFO, "Solicitud aprobada", "Solicitud aprobada correctamente");
         } else {
            showMessage(FacesMessage.SEVERITY_ERROR, "Error", "Ocurrió un error al tratar de aprobar la solicitud");
         }
         cargarSolicitudes();
      } catch (Exception e) {
         showMessage(FacesMessage.SEVERITY_FATAL, "Error", "Ocurrió un error al tratar de aprobar la solicitud");
         logger.error("aprobarSolcitud(): " + e);
      }
   }

   @Override
   public void editRow(RowEditEvent event) {
      throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
   }

   @Override
   public void onRowCancel(RowEditEvent event) {
      throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
   }

   @Override
   public void onRowReorder(ReorderEvent event) {
      throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
   }

   @Override
   public void addRow() {
      throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
   }

   @Override
   public void deleteRow() {
      throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
   }

   public PagosPolizaController getPagosPolizaController() {
      return pagosPolizaController;
   }

   public void setPagosPolizaController(PagosPolizaController pagosPolizaController) {
      this.pagosPolizaController = pagosPolizaController;
   }

   public List<SolicitudDevolucionDetellePagoPoliza> getListSolicitudes() {
      return listSolicitudes;
   }

   public void setListSolicitudes(List<SolicitudDevolucionDetellePagoPoliza> listSolicitudes) {
      this.listSolicitudes = listSolicitudes;
   }

   public SolicitudDevolucionDetellePagoPoliza getSelectSolicitud() {
      return selectSolicitud;
   }

   public void setSelectSolicitud(SolicitudDevolucionDetellePagoPoliza selectSolicitud) {
      this.selectSolicitud = selectSolicitud;
   }

   private Date correcciónDeHr(Date fecha, int horas) {
      Calendar calendar = Calendar.getInstance();
      calendar.setTime(fecha);
      calendar.add(Calendar.HOUR_OF_DAY, horas);
      Date nuevaFecha = calendar.getTime();
      return nuevaFecha;
   }
}
