/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.rjconsultores.ventaboletos.web.gui.controladores.tarifas;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.zkoss.util.resource.Labels;
import org.zkoss.zhtml.Messagebox;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zul.Button;
import org.zkoss.zul.Checkbox;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Tab;
import org.zkoss.zul.Textbox;

import com.rjconsultores.ventaboletos.entidad.Marca;
import com.rjconsultores.ventaboletos.entidad.Redondeo;
import com.rjconsultores.ventaboletos.entidad.RedondeoCtrl;
import com.rjconsultores.ventaboletos.entidad.RedondeoMarca;
import com.rjconsultores.ventaboletos.service.MarcaService;
import com.rjconsultores.ventaboletos.service.RedondeoCtrlService;
import com.rjconsultores.ventaboletos.service.RedondeoMarcaService;
import com.rjconsultores.ventaboletos.service.RedondeoService;
import com.rjconsultores.ventaboletos.utilerias.TraslaparUtil;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderRedondeo;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderRedondeoMarca;

/**
 *
 * @author Administrador
 */
@Controller("editarRedondeoController")
@Scope("prototype")
public class EditarRedondeoController extends MyGenericForwardComposer {

    @Autowired
    private RedondeoService redondeoService;
    @Autowired
    private RedondeoCtrlService redondeoCtrlService;
    @Autowired
    private RedondeoMarcaService redondeoMarcaService;
    @Autowired
    private MarcaService marcaService;
    private Redondeo redondeo;
    private RedondeoCtrl redondeoCtrl;
    private MyListbox redondeoCtrlList;
    private MyListbox redondeoList;
    private MyListbox redondeoMarcaList;
    private Button btnApagar;
    private List<Marca> lsMarca;
    private List<Redondeo> lsRedondeo;
    private List<RedondeoMarca> lsRedondeoMarca;
    private Textbox txtValorinicial;
    private Textbox txtValorfinal;
    private Textbox txtValorredondeo;
    private Tab tabGeneral;
    private Tab tabMarca;
    private Combobox cmbMarca;
    private Checkbox chkIndaplicadescuento;
    private Checkbox chkIndaplicapricing;
    private static Logger log = Logger.getLogger(EditarRedondeoController.class);

    @Override
    public void doAfterCompose(Component comp) throws Exception {

        lsMarca = marcaService.buscarMarcaPorEmpresa(UsuarioLogado.getUsuarioLogado().getEmpresa());

        super.doAfterCompose(comp);

        redondeoCtrl = (RedondeoCtrl) Executions.getCurrent().getArg().get("redondeoCtrl");
        redondeoCtrlList = (MyListbox) Executions.getCurrent().getArg().get("redondeoCtrlList");


        redondeoList.setItemRenderer(new RenderRedondeo());
        lsRedondeo = new ArrayList<Redondeo>();

        redondeoMarcaList.setItemRenderer(new RenderRedondeoMarca());
        lsRedondeoMarca = new ArrayList<RedondeoMarca>();

        if (redondeoCtrl.getRedondeoctrlId() == null) {
            btnApagar.setVisible(Boolean.FALSE);
        } else {
            chkIndaplicadescuento.setChecked(redondeoCtrl.getIndaplicadescuento());
            chkIndaplicapricing.setChecked(redondeoCtrl.getIndaplicapricing());

            redondeoCtrl = redondeoCtrlService.obtenerID(redondeoCtrl.getRedondeoctrlId());

            lsRedondeo = redondeoCtrl.getRedondeoList();
            redondeoList.setData(lsRedondeo);

            lsRedondeoMarca = redondeoCtrl.getRedondeoMarcaList();
            redondeoMarcaList.setData(lsRedondeoMarca);
        }

        txtValorinicial.focus();
    }

    public void onClick$btnSalvar(Event ev) {
        redondeoCtrl.setFecmodif(Calendar.getInstance().getTime());
        redondeoCtrl.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
        redondeoCtrl.setActivo(Boolean.TRUE);

        Boolean aplicaDescuento = chkIndaplicadescuento.isChecked();
        Boolean aplicaPricing = chkIndaplicapricing.isChecked();
        try {

            if (redondeoList.getData().length == 0) {
                tabGeneral.setSelected(Boolean.TRUE);
                Messagebox.show(
                        Labels.getLabel("editarRedondeoController.MSG.necesitaDescuento"),
                        Labels.getLabel("editarRedondeoController.window.title"),
                        Messagebox.OK, Messagebox.EXCLAMATION);
                return;
            }
            if (redondeoMarcaList.getData().length == 0) {
                tabMarca.setSelected(Boolean.TRUE);
                Messagebox.show(
                        Labels.getLabel("editarRedondeoController.MSG.necesitaMarca"),
                        Labels.getLabel("editarRedondeoController.window.title"),
                        Messagebox.OK, Messagebox.EXCLAMATION);
                return;
            }

            redondeoCtrl.setIndaplicadescuento(aplicaDescuento);
            redondeoCtrl.setIndaplicapricing(aplicaPricing);

            if (podeSalvar()) {
                redondeoCtrl.setIndaplicadescuento(aplicaDescuento);
                redondeoCtrl.setIndaplicapricing(aplicaPricing);

                redondeoCtrl.setActivo(Boolean.TRUE);
                redondeoCtrl.setFecmodif(Calendar.getInstance().getTime());
                redondeoCtrl.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());

                if (redondeoCtrl.getRedondeoctrlId() == null) {
                    redondeoCtrlService.suscribir(redondeoCtrl);
                    redondeoCtrlList.addItem(redondeoCtrl);
                } else {
                    redondeoCtrlService.actualizacion(redondeoCtrl);
                    redondeoCtrlList.updateItem(redondeoCtrl);
                }

                Messagebox.show(
                        Labels.getLabel("editarRedondeoController.MSG.SuscbrirOK"),
                        Labels.getLabel("editarRedondeoController.window.title"),
                        Messagebox.OK, Messagebox.INFORMATION);

                closeWindow();
            } else {
                Messagebox.show(
                        Labels.getLabel("MSG.Registro.Existe"),
                        Labels.getLabel("editarRedondeoController.window.title"),
                        Messagebox.OK, Messagebox.EXCLAMATION);
            }

        } catch (Exception ex) {
            log.error(ex);
        }
    }

    public boolean podeSalvar() {

        List<Redondeo> lsRedondeoNuevos = redondeoCtrl.getRedondeoList();
        List<RedondeoMarca> lsRedondeoMarcaNuevos = redondeoCtrl.getRedondeoMarcaList();

        Short[] iDMarcas = new Short[lsRedondeoMarcaNuevos.size()];
        for (int i = 0; i < lsRedondeoMarcaNuevos.size(); i++) {
            iDMarcas[i] = lsRedondeoMarcaNuevos.get(i).getMarca().getMarcaId().shortValue();
        }

        boolean podeSalvar = true;

        //Traslapa Redondeo
        for (Redondeo r : lsRedondeoNuevos) {
            List<RedondeoCtrl> lsCtrl = redondeoCtrlService.buscarTraslapa(iDMarcas, r.getValorinicial(), r.getValorfinal(), redondeoCtrl.getIndaplicadescuento(), redondeoCtrl.getIndaplicapricing());
            if (!lsCtrl.isEmpty()) {
                if (redondeoCtrl.getRedondeoctrlId() != null) {
                    for (RedondeoCtrl rc : lsCtrl) {
                        if (!rc.getRedondeoctrlId().equals(redondeoCtrl.getRedondeoctrlId())) {
                            podeSalvar = false;
                            log.debug("Não pode salvar!");
                        }
                    }
                } else {
                    podeSalvar = false;
                }
            }
        }

        return podeSalvar;
    }

    public void onClick$btnApagar(Event ev) {
        try {
            int opcao = Messagebox.show(
                    Labels.getLabel("editarRedondeoController.MSG.Deseja.Borrar"),
                    Labels.getLabel("editarRedondeoController.window.title"),
                    Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);

            if (opcao == Messagebox.YES) {
                redondeoCtrl.setFecmodif(Calendar.getInstance().getTime());
                redondeoCtrl.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
                redondeoCtrl.setActivo(Boolean.TRUE);

                redondeoCtrlService.borrar(redondeoCtrl);
                redondeoCtrlList.removeItem(redondeoCtrl);

                Messagebox.show(
                        Labels.getLabel("editarRedondeoController.MSG.BorrarOK"),
                        Labels.getLabel("editarRedondeoController.window.title"),
                        Messagebox.OK, Messagebox.INFORMATION);

                closeWindow();
            }
        } catch (Exception ex) {
            log.error(ex);
        }
    }

    public void onClick$btnAdicionarRedondeo(Event ev) throws InterruptedException {

        txtValorinicial.getValue();
        txtValorfinal.getValue();
        txtValorredondeo.getValue();

        try {

            BigDecimal valorInicial = BigDecimal.valueOf(Double.parseDouble(txtValorinicial.getValue()));
            BigDecimal valorFinal = BigDecimal.valueOf(Double.parseDouble(txtValorfinal.getValue()));

            if (valorInicial.doubleValue() > valorFinal.doubleValue()) {
                Messagebox.show(
                        Labels.getLabel("editarRedondeoController.MSG.valores"),
                        Labels.getLabel("editarRedondeoController.window.title"),
                        Messagebox.OK, Messagebox.EXCLAMATION);
                return;
            }

            BigDecimal valorRedondeo = new BigDecimal(BigInteger.ZERO);
            if (!txtValorredondeo.getValue().equals("")) {
                valorRedondeo = BigDecimal.valueOf(Double.parseDouble(txtValorredondeo.getValue()));
            }

            boolean existe = true;

            for (Redondeo r : lsRedondeo) {
                if (r.getActivo()) {
                    boolean traslapa = TraslaparUtil.intersectNum(r.getValorinicial(), r.getValorfinal(), valorInicial, valorFinal);
                    if (traslapa) {
                        existe = false;
                    }
                }
            }
            if (existe) {

                Redondeo r = new Redondeo();

                r.setActivo(Boolean.TRUE);
                r.setFecmodif(Calendar.getInstance().getTime());
                r.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
                r.setValorinicial(valorInicial);
                r.setValorfinal(valorFinal);
                r.setValorredondeo(valorRedondeo);
                r.setRedondeoCtrl(redondeoCtrl);


                lsRedondeo.add(r);
                redondeoCtrl.setRedondeoList(lsRedondeo);

                redondeoList.setData(new ArrayList<Redondeo>());
                List<Redondeo> lsTemp = new ArrayList<Redondeo>();
                for (Redondeo cc : lsRedondeo) {
                    if (cc.getActivo()) {
                        lsTemp.add(cc);
                    }
                }
                redondeoList.setData(lsTemp);

                txtValorinicial.setConstraint("");
                txtValorfinal.setConstraint("");
                txtValorredondeo.setConstraint("");

                txtValorinicial.setText("");
                txtValorfinal.setText("");
                txtValorredondeo.setText("");

                txtValorinicial.setConstraint("no empty, no zero");
                txtValorfinal.setConstraint("no empty, no zero");
                //txtValorredondeo.setConstraint("no empty");
            } else {
                Messagebox.show(
                        Labels.getLabel("editarRedondeoController.MSG.valoresTraslapa"),
                        Labels.getLabel("editarRedondeoController.window.title"),
                        Messagebox.OK, Messagebox.EXCLAMATION);
            }

        } catch (Exception ex) {
            log.error("Erro adicionar redondeo : " + ex);
            Messagebox.show(
                    Labels.getLabel("MSG.Error"),
                    Labels.getLabel("editarRedondeoController.window.title"),
                    Messagebox.OK, Messagebox.ERROR);
        }
    }

    public void onClick$btnApagarRedondeo(Event ev) throws InterruptedException {
        try {
            Redondeo r = (Redondeo) redondeoList.getSelected();
            if (r != null) {
                //removo o antigo
                lsRedondeo.remove(r);
                r.setFecmodif(Calendar.getInstance().getTime());
                r.setActivo(Boolean.FALSE);
                r.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
                redondeoList.updateItem(r);
                redondeoList.removeItem(r);
                lsRedondeo.add(r);

            } else {
                Messagebox.show(
                        Labels.getLabel("editarConfiguracionCategoriaController.MSG.selectItem"),
                        Labels.getLabel("editarRedondeoController.window.title"),
                        Messagebox.OK, Messagebox.EXCLAMATION);
            }
        } catch (Exception ex) {
            log.error("Erro remover redondeo: " + ex);
            Messagebox.show(
                    Labels.getLabel("MSG.Error"),
                    Labels.getLabel("editarRedondeoController.window.title"),
                    Messagebox.OK, Messagebox.ERROR);
        }
    }

    public void onClick$btnAdicionarMarca(Event ev) throws InterruptedException {

        cmbMarca.getValue();
        try {
            boolean existe = false;
            Marca m = (Marca) cmbMarca.getSelectedItem().getValue();
            for (RedondeoMarca rm : lsRedondeoMarca) {
                if (rm.getActivo() && rm.getMarca().equals(m)) {
                    existe = true;
                }
            }
            if (!existe) {
                RedondeoMarca rm = new RedondeoMarca();

                rm.setActivo(Boolean.TRUE);
                rm.setFecmodif(Calendar.getInstance().getTime());
                rm.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
                rm.setMarca(m);
                rm.setRedondeoCtrl(redondeoCtrl);

                lsRedondeoMarca.add(rm);
                redondeoCtrl.setRedondeoMarcaList(lsRedondeoMarca);

                redondeoMarcaList.setData(new ArrayList<RedondeoMarca>());
                List<RedondeoMarca> lsTemp = new ArrayList<RedondeoMarca>();
                for (RedondeoMarca cc : lsRedondeoMarca) {
                    if (cc.getActivo()) {
                        lsTemp.add(cc);
                    }
                }
                redondeoMarcaList.setData(lsTemp);

            } else {
                Messagebox.show(
                        Labels.getLabel("MSG.Registro.Existe"),
                        Labels.getLabel("editarRedondeoController.window.title"),
                        Messagebox.OK, Messagebox.EXCLAMATION);
            }

        } catch (Exception ex) {
            log.error("Erro adicionar redondeo marca : " + ex);
            Messagebox.show(
                    Labels.getLabel("MSG.Error"),
                    Labels.getLabel("editarRedondeoController.window.title"),
                    Messagebox.OK, Messagebox.ERROR);
        }
    }

    public void onClick$btnApagarMarca(Event ev) throws InterruptedException {
        try {
            RedondeoMarca rm = (RedondeoMarca) redondeoMarcaList.getSelected();
            if (rm != null) {
                //removo o antigo
//                for (int i = 0; i < lsRedondeoMarca.size(); i++) {
//                    if (lsRedondeoMarca.get(i).getMarca().equals(rm.getMarca())) {
                lsRedondeoMarca.remove(rm);
//                    }
//                }
                rm.setFecmodif(Calendar.getInstance().getTime());
                rm.setActivo(Boolean.FALSE);
                rm.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
                redondeoMarcaList.removeItem(rm);
                lsRedondeoMarca.add(rm);

            } else {
                Messagebox.show(
                        Labels.getLabel("editarConfiguracionCategoriaController.MSG.selectItem"),
                        Labels.getLabel("editarRedondeoController.window.title"),
                        Messagebox.OK, Messagebox.EXCLAMATION);
            }
        } catch (Exception ex) {
            log.error("Erro remover redondeo Marca: " + ex);
            Messagebox.show(
                    Labels.getLabel("MSG.Error"),
                    Labels.getLabel("editarRedondeoController.window.title"),
                    Messagebox.OK, Messagebox.ERROR);
        }
    }

    public Button getBtnApagar() {
        return btnApagar;
    }

    public void setBtnApagar(Button btnApagar) {
        this.btnApagar = btnApagar;
    }

    public Checkbox getChkIndaplicadescuento() {
        return chkIndaplicadescuento;
    }

    public void setChkIndaplicadescuento(Checkbox chkIndaplicadescuento) {
        this.chkIndaplicadescuento = chkIndaplicadescuento;
    }

    public Checkbox getChkIndaplicapricing() {
        return chkIndaplicapricing;
    }

    public void setChkIndaplicapricing(Checkbox chkIndaplicapricing) {
        this.chkIndaplicapricing = chkIndaplicapricing;
    }

    public Redondeo getRedondeo() {
        return redondeo;
    }

    public void setRedondeo(Redondeo redondeo) {
        this.redondeo = redondeo;
    }

    public Textbox getTxtValorfinal() {
        return txtValorfinal;
    }

    public void setTxtValorfinal(Textbox txtValorfinal) {
        this.txtValorfinal = txtValorfinal;
    }

    public Textbox getTxtValorinicial() {
        return txtValorinicial;
    }

    public void setTxtValorinicial(Textbox txtValorinicial) {
        this.txtValorinicial = txtValorinicial;
    }

    public Textbox getTxtValorredondeo() {
        return txtValorredondeo;
    }

    public void setTxtValorredondeo(Textbox txtValorredondeo) {
        this.txtValorredondeo = txtValorredondeo;
    }

    public List<Marca> getLsMarca() {
        return lsMarca;
    }

    public void setLsMarca(List<Marca> lsMarca) {
        this.lsMarca = lsMarca;
    }

    public List<Redondeo> getLsRedondeo() {
        return lsRedondeo;
    }

    public void setLsRedondeo(List<Redondeo> lsRedondeo) {
        this.lsRedondeo = lsRedondeo;
    }

    public List<RedondeoMarca> getLsRedondeoMarca() {
        return lsRedondeoMarca;
    }

    public void setLsRedondeoMarca(List<RedondeoMarca> lsRedondeoMarca) {
        this.lsRedondeoMarca = lsRedondeoMarca;
    }

    public MarcaService getMarcaService() {
        return marcaService;
    }

    public void setMarcaService(MarcaService marcaService) {
        this.marcaService = marcaService;
    }

    public RedondeoCtrl getRedondeoCtrl() {
        return redondeoCtrl;
    }

    public void setRedondeoCtrl(RedondeoCtrl redondeoCtrl) {
        this.redondeoCtrl = redondeoCtrl;
    }

    public MyListbox getRedondeoCtrlList() {
        return redondeoCtrlList;
    }

    public void setRedondeoCtrlList(MyListbox redondeoCtrlList) {
        this.redondeoCtrlList = redondeoCtrlList;
    }

    public RedondeoCtrlService getRedondeoCtrlService() {
        return redondeoCtrlService;
    }

    public void setRedondeoCtrlService(RedondeoCtrlService redondeoCtrlService) {
        this.redondeoCtrlService = redondeoCtrlService;
    }

    public MyListbox getRedondeoList() {
        return redondeoList;
    }

    public void setRedondeoList(MyListbox redondeoList) {
        this.redondeoList = redondeoList;
    }

    public MyListbox getRedondeoMarcaList() {
        return redondeoMarcaList;
    }

    public void setRedondeoMarcaList(MyListbox redondeoMarcaList) {
        this.redondeoMarcaList = redondeoMarcaList;
    }

    public RedondeoService getRedondeoService() {
        return redondeoService;
    }

    public void setRedondeoService(RedondeoService redondeoService) {
        this.redondeoService = redondeoService;
    }
}
