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

import com.arrebol.taxiservicios.beans.TaxiGenericBean;
import com.arrebol.taxiservicios.controller.cobranza.CobranzaController;
import com.arrebol.taxiservicios.controller.predio.AbonoLoteController;
import com.arrebol.taxiservicios.controller.predio.PredioController;
import com.arrebol.taxiservicios.controller.predio.PreventaController;
import com.arrebol.taxiservicios.model.enums.EstatusLote;
import com.arrebol.taxiservicios.model.enums.TipoAbono;
import com.arrebol.taxiservicios.model.predio.AbonoLote;
import com.arrebol.taxiservicios.model.predio.Lote;
import com.arrebol.taxiservicios.model.predio.Manzana;
import com.arrebol.taxiservicios.model.predio.Predio;
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 pc one
 */
@Named("reconstruccionBean")
@ViewScoped
public class ReconstruccionSaldosBean extends TaxiGenericBean implements Serializable {

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

    private PredioController predioController;
    private PreventaController preventaController;
    private AbonoLoteController abonoLoteController;
    private CobranzaController cobranzaController;
    private Predio predio;
    List<Predio> predios;
    private String selectPredio;
    private Manzana manzana;
    private List<Manzana> manzanas;
    private Manzana selectManzana;
    private Lote lote;
    private List<Lote> lotes;
    private AbonoLote abonoLote;
    private List<AbonoLote> abonos;
    private double actualizarPago;
    private Boolean active;
    //datos del pago
    private Double InteresMensualPago;
    private Double Intereses;
    private Double TotalAPagar;
    private Double TotalCreadito;
    private Double TotalCreaditoA;
    private Double pagoPorMes;

    @PostConstruct
    public void init() {
        logger.info("start init Reconstruccion de Saldos Bean");
        try {
            setActive(false);
            setPreventaController(new PreventaController());
            setPredios(getPreventaController().fillAllPredio(getLoggedUser().getLocation()));
        } catch (Exception e) {
            logger.error("Reconstruccion de Saldos Bean init", e);
        }
    }
    
    public void fillManzanas() {
        logger.info("Buscando predios");
        setManzanas(getPreventaController().fillAllManzanas(new Predio(getSelectPredio())));
    }

    public void updateSaldos() {
        setActive(true);
        logger.info("Comenzando actualización de saldos, Manzana: "+getSelectManzana().getId());
        showMessage(FacesMessage.SEVERITY_INFO, "Reconstruyendo", "Comenzando reconstruir de saldos");
        actualizarPagosPorManzana(getSelectManzana());
        logger.info("La reconstrucción de los saldos se realizó correctamente ");
        showMessage(FacesMessage.SEVERITY_INFO, "Reconstrucción correcta", "La reconstrucción de los saldos se realizó correctamente");
    }

    /*public void actualizarPagosPorPredio(String idPredio) {
        setCobranzaController(new CobranzaController());
        setPreventaController(new PreventaController());
        setManzanas(getPreventaController().fillAllManzanas(new Predio(idPredio)));
        for (Manzana ma : getManzanas()) {
            setLotes(getPreventaController().fillAllLotes(ma));
            for (Lote lo : getLotes()) {
                if (lo.getEstatusLote().equals(EstatusLote.VENDIDO)) {
                    corregirDatosPagoLote(lo);
                    setAbonos(getCobranzaController().fillAbonoLoteByLote(lo));
                    for (AbonoLote ab : getAbonos()) {
                        corregirDatosPagoAbonoLote(ab, lo);
                    }
                }
            }
        }
    }*/
    
    public void actualizarPagosPorManzana(Manzana ma) {
        setCobranzaController(new CobranzaController());
        setPreventaController(new PreventaController());
        setLotes(getPreventaController().fillAllLotes(ma));
        for (Lote lo : getLotes()) {
            if (lo.getEstatusLote().equals(EstatusLote.VENDIDO)) {
                corregirDatosPagoLote(lo);
                setAbonos(getCobranzaController().fillAbonoLoteByLote(lo));
                for (AbonoLote ab : getAbonos()) {
                    corregirDatosPagoAbonoLote(ab, lo);
                }
            }
        }
    }

    public void corregirDatosPagoAbonoLote(AbonoLote ab, Lote lo) {
        logger.info("Corrección de los datos concernientes al pago del abono lote");
        try {
            if (ab.getTipoAbono().equals(TipoAbono.ANTICIPO)) {
                ab.setPago(lo.getAnticipo());
                ab.setSaldoAnterior(getTotalCreadito());
                ab.setSaldoNuevo(getTotalCreaditoA());
            } else if (ab.getTipoAbono().equals(TipoAbono.ABONO)) {
                ab.setPago(getPagoPorMes());
                ab.setSaldoAnterior(getActualizarPago());
                setActualizarPago(getActualizarPago() - getPagoPorMes());
                ab.setSaldoNuevo(getActualizarPago());
            }
            getCobranzaController().addAbonoLote(ab, getLoggedUser(), false);
        } catch (Exception e) {
            logger.error("Error al corregir los datos del abono lote: " + ab.getId() + " " + e);
            showMessage(FacesMessage.SEVERITY_FATAL, "Error", "Error al corregir los datos del abono lote");
        }
    }

    public void corregirDatosPagoLote(Lote lote) {
        logger.info("Corrección de los datos concernientes al pago del lote");
        //InteresMensualPago = lote.getCosto() * (lote.getManzana().getPredio().getInteresMensual() / 100);
        setInteresMensualPago(lote.getCosto() * (lote.getManzana().getPredio().getInteresMensual() / 100));
        //Intereses = InteresMensualPago * Integer.parseInt(lote.getPlazoMeses());
        setIntereses(getInteresMensualPago() * Integer.parseInt(lote.getPlazoMeses()));
        //TotalAPagar = lote.getCosto() + Intereses;
        setTotalAPagar(lote.getCosto() + getIntereses());
        //TotalCreadito = TotalAPagar + lote.getManzana().getPredio().getComisionMensual();
        setTotalCreadito(getTotalAPagar() + lote.getManzana().getPredio().getComisionMensual());
        //TotalCreaditoA = TotalCreadito - lote.getAnticipo();
        setTotalCreaditoA(getTotalCreadito() - lote.getAnticipo());
        //pagoPorMes = TotalCreaditoA / Integer.parseInt(lote.getPlazoMeses());
        setPagoPorMes(getTotalCreaditoA() / Integer.parseInt(lote.getPlazoMeses()));
        //Actualización del lote                                
        try {
            lote.setTotalAPagar(getTotalCreadito());
            lote.setTotalPago(getTotalCreaditoA());
            lote.setMensualidad(getPagoPorMes());
            setPredioController(new PredioController());
            getPredioController().addLote(lote, getLoggedUser(), false);
            setActualizarPago(getTotalCreaditoA());
        } catch (Exception e) {
            logger.error("Error al corregir los datos del lote: " + lote.getId() + " " + e);
            showMessage(FacesMessage.SEVERITY_FATAL, "Error", "Error al corregir los datos del lote");
        }
    }

    public PredioController getPredioController() {
        return predioController;
    }

    public void setPredioController(PredioController predioController) {
        this.predioController = predioController;
    }

    public PreventaController getPreventaController() {
        return preventaController;
    }

    public void setPreventaController(PreventaController preventaController) {
        this.preventaController = preventaController;
    }

    public AbonoLoteController getAbonoLoteController() {
        return abonoLoteController;
    }

    public void setAbonoLoteController(AbonoLoteController abonoLoteController) {
        this.abonoLoteController = abonoLoteController;
    }

    public CobranzaController getCobranzaController() {
        return cobranzaController;
    }

    public void setCobranzaController(CobranzaController cobranzaController) {
        this.cobranzaController = cobranzaController;
    }

    public Predio getPredio() {
        return predio;
    }

    public void setPredio(Predio predio) {
        this.predio = predio;
    }

    public Manzana getManzana() {
        return manzana;
    }

    public void setManzana(Manzana manzana) {
        this.manzana = manzana;
    }

    public List<Manzana> getManzanas() {
        return manzanas;
    }

    public void setManzanas(List<Manzana> manzanas) {
        this.manzanas = manzanas;
    }

    public Lote getLote() {
        return lote;
    }

    public void setLote(Lote lote) {
        this.lote = lote;
    }

    public List<Lote> getLotes() {
        return lotes;
    }

    public void setLotes(List<Lote> lotes) {
        this.lotes = lotes;
    }

    public double getActualizarPago() {
        return actualizarPago;
    }

    public void setActualizarPago(double actualizarPago) {
        this.actualizarPago = actualizarPago;
    }

    public AbonoLote getAbonoLote() {
        return abonoLote;
    }

    public void setAbonoLote(AbonoLote abonoLote) {
        this.abonoLote = abonoLote;
    }

    public List<AbonoLote> getAbonos() {
        return abonos;
    }

    public void setAbonos(List<AbonoLote> abonos) {
        this.abonos = abonos;
    }

    public Double getInteresMensualPago() {
        return InteresMensualPago;
    }

    public void setInteresMensualPago(Double InteresMensualPago) {
        this.InteresMensualPago = InteresMensualPago;
    }

    public Double getIntereses() {
        return Intereses;
    }

    public void setIntereses(Double Intereses) {
        this.Intereses = Intereses;
    }

    public Double getTotalAPagar() {
        return TotalAPagar;
    }

    public void setTotalAPagar(Double TotalAPagar) {
        this.TotalAPagar = TotalAPagar;
    }

    public Double getTotalCreadito() {
        return TotalCreadito;
    }

    public void setTotalCreadito(Double TotalCreadito) {
        this.TotalCreadito = TotalCreadito;
    }

    public Double getTotalCreaditoA() {
        return TotalCreaditoA;
    }

    public void setTotalCreaditoA(Double TotalCreaditoA) {
        this.TotalCreaditoA = TotalCreaditoA;
    }

    public Double getPagoPorMes() {
        return pagoPorMes;
    }

    public void setPagoPorMes(Double pagoPorMes) {
        this.pagoPorMes = pagoPorMes;
    }

    public List<Predio> getPredios() {
        return predios;
    }

    public void setPredios(List<Predio> predios) {
        this.predios = predios;
    }

    public String getSelectPredio() {
        return selectPredio;
    }

    public void setSelectPredio(String selectPredio) {
        this.selectPredio = selectPredio;
    }

    public Boolean getActive() {
        return active;
    }

    public void setActive(Boolean active) {
        this.active = active;
    }

    public Manzana getSelectManzana() {
        return selectManzana;
    }

    public void setSelectManzana(Manzana selectManzana) {
        this.selectManzana = selectManzana;
    }

}
