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

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Comparator;
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.zk.ui.util.Clients;
import org.zkoss.zul.Button;
import org.zkoss.zul.Checkbox;
import org.zkoss.zul.Longbox;
import org.zkoss.zul.Radio;
import org.zkoss.zul.Textbox;

import com.rjconsultores.ventaboletos.entidad.CuponSecretaria;
import com.rjconsultores.ventaboletos.entidad.Secretaria;
import com.rjconsultores.ventaboletos.service.CuponSecretariaService;
import com.rjconsultores.ventaboletos.service.SecretariaService;
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.MyTextboxDecimal;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderCuponSecretaria;

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

    @Autowired
    private SecretariaService secretariaService;
    private CuponSecretariaService cuponSecretariaService;
    private Secretaria secretaria;
    private List<CuponSecretaria> lsCuponSecretaria;
    private MyListbox secretariaList;
    private MyListbox cuponSecretariaList;
    private Textbox txtDescSecretaria;
    private Textbox txtCveSecretaria;
    private MyTextboxDecimal txtPorcdescuento;
    private MyTextboxDecimal txtPorcdescuentoOutros;
    private MyTextboxDecimal txtPorcdescuentoPedagio;
    private MyTextboxDecimal txtPorcdescuentoSeguro;
    private MyTextboxDecimal txtPorcdescuentoTaxaEmbarque;
    private Longbox txtNumfolioinicio;
    private Longbox txtNumfoliofinal;
    private Button btnApagar;
    private Button btnAdicionarCuponSecretaria;
    private Radio rdPrecioTotal;
    private Radio rdPrecioDescuento;
    private Radio rdDescuento;
    private Checkbox chkValidaFolio;
    private static Logger log = Logger.getLogger(EditarSecretariaController.class);

    public Button getBtnApagar() {
        return btnApagar;
    }

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

    public Checkbox getChkValidaFolio() {
        return chkValidaFolio;
    }

    public void setChkValidaFolio(Checkbox chkValidaFolio) {
        this.chkValidaFolio = chkValidaFolio;
    }

    public MyListbox getCuponSecretariaList() {
        return cuponSecretariaList;
    }

    public void setCuponSecretariaList(MyListbox cuponSecretariaList) {
        this.cuponSecretariaList = cuponSecretariaList;
    }

    public Radio getRdDescuento() {
        return rdDescuento;
    }

    public void setRdDescuento(Radio rdDescuento) {
        this.rdDescuento = rdDescuento;
    }

    public Radio getRdPrecioDescuento() {
        return rdPrecioDescuento;
    }

    public void setRdPrecioDescuento(Radio rdPrecioDescuento) {
        this.rdPrecioDescuento = rdPrecioDescuento;
    }

    public Radio getRdPrecioTotal() {
        return rdPrecioTotal;
    }

    public void setRdPrecioTotal(Radio rdPrecioTotal) {
        this.rdPrecioTotal = rdPrecioTotal;
    }

    public Secretaria getSecretaria() {
        return secretaria;
    }

    public void setSecretaria(Secretaria secretaria) {
        this.secretaria = secretaria;
    }

    public Textbox getTxtCveSecretaria() {
        return txtCveSecretaria;
    }

    public void setTxtCveSecretaria(Textbox txtCveSecretaria) {
        this.txtCveSecretaria = txtCveSecretaria;
    }

    public Textbox getTxtDescSecretaria() {
        return txtDescSecretaria;
    }

    public void setTxtDescSecretaria(Textbox txtDescSecretaria) {
        this.txtDescSecretaria = txtDescSecretaria;
    }

    public Longbox getTxtNumfoliofinal() {
        return txtNumfoliofinal;
    }

    public void setTxtNumfoliofinal(Longbox txtNumfoliofinal) {
        this.txtNumfoliofinal = txtNumfoliofinal;
    }

    public Longbox getTxtNumfolioinicio() {
        return txtNumfolioinicio;
    }

    public void setTxtNumfolioinicio(Longbox txtNumfolioinicio) {
        this.txtNumfolioinicio = txtNumfolioinicio;
    }

    public MyTextboxDecimal getTxtPorcdescuentoOutros() {
		return txtPorcdescuentoOutros;
	}

	public void setTxtPorcdescuentoOutros(MyTextboxDecimal txtPorcdescuentoOutros) {
		this.txtPorcdescuentoOutros = txtPorcdescuentoOutros;
	}

	public MyTextboxDecimal getTxtPorcdescuentoPedagio() {
		return txtPorcdescuentoPedagio;
	}

	public void setTxtPorcdescuentoPedagio(MyTextboxDecimal txtPorcdescuentoPedagio) {
		this.txtPorcdescuentoPedagio = txtPorcdescuentoPedagio;
	}

	public MyTextboxDecimal getTxtPorcdescuentoSeguro() {
		return txtPorcdescuentoSeguro;
	}

	public void setTxtPorcdescuentoSeguro(MyTextboxDecimal txtPorcdescuentoSeguro) {
		this.txtPorcdescuentoSeguro = txtPorcdescuentoSeguro;
	}

	public MyTextboxDecimal getTxtPorcdescuentoTaxaEmbarque() {
		return txtPorcdescuentoTaxaEmbarque;
	}

	public void setTxtPorcdescuentoTaxaEmbarque(MyTextboxDecimal txtPorcdescuentoTaxaEmbarque) {
		this.txtPorcdescuentoTaxaEmbarque = txtPorcdescuentoTaxaEmbarque;
	}

	public Button getBtnAdicionarCuponSecretaria() {
        return btnAdicionarCuponSecretaria;
    }

    public void setBtnAdicionarCuponSecretaria(Button btnAdicionarCuponSecretaria) {
        this.btnAdicionarCuponSecretaria = btnAdicionarCuponSecretaria;
    }

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

        secretaria =
                (Secretaria) Executions.getCurrent().getArg().get("secretaria");
        secretariaList =
                (MyListbox) Executions.getCurrent().getArg().get("secretariaList");

        cuponSecretariaList.setItemRenderer(new RenderCuponSecretaria());
        lsCuponSecretaria = new ArrayList<CuponSecretaria>();
        cuponSecretariaList.setData(lsCuponSecretaria);

        if (secretaria.getSecretariaId() == null) {
            btnApagar.setVisible(Boolean.FALSE);
        } else {
            secretaria = secretariaService.obtenerID(secretaria.getSecretariaId());
            if (secretaria.getImprimeprecio().equals(Secretaria.DESCUENTO_COBRAR)) {
                rdDescuento.setChecked(Boolean.TRUE);
            } else if (secretaria.getImprimeprecio().equals(Secretaria.PRECIO_MENOS_DESCUENTO)) {
                rdPrecioDescuento.setChecked(Boolean.TRUE);
            } else if (secretaria.getImprimeprecio().equals(Secretaria.PRECIO_TOTAL)) {
                rdPrecioTotal.setChecked(Boolean.TRUE);
            }

            chkValidaFolio.setChecked(secretaria.getValidafolio());
            chkValidaFolio.setDisabled(Boolean.TRUE);

            onClick$chkValidaFolio(null);

            lsCuponSecretaria = secretaria.getLsCuponSecretaria();
            cuponSecretariaList.setData(lsCuponSecretaria);

        }

        txtDescSecretaria.focus();
    }

    public void onClick$chkValidaFolio(Event ev) {
        if (chkValidaFolio.isChecked()) {
            txtNumfolioinicio.setDisabled(Boolean.FALSE);
            txtNumfoliofinal.setDisabled(Boolean.FALSE);
        } else {
            txtNumfolioinicio.setValue(null);
            txtNumfoliofinal.setValue(null);

            txtNumfolioinicio.setDisabled(Boolean.TRUE);
            txtNumfoliofinal.setDisabled(Boolean.TRUE);
        }
    }

    public void onClick$btnSalvar(Event ev) throws InterruptedException {
        txtDescSecretaria.getValue();
        txtCveSecretaria.getValue();

        try {

            if (lsCuponSecretaria.isEmpty()) {
                Messagebox.show(
                        Labels.getLabel("editarSecretariaController.MSG.necessaitaPorcentaje.value"),
                        Labels.getLabel("editarSecretariaController.window.title"),
                        Messagebox.OK, Messagebox.EXCLAMATION);
                return;
            }

            secretaria.setActivo(true);
            secretaria.setFecmodif(Calendar.getInstance().getTime());
            secretaria.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
            secretaria.setLsCuponSecretaria(lsCuponSecretaria);
            secretaria.setValidafolio(chkValidaFolio.isChecked());

            if (rdDescuento.isChecked()) {
                secretaria.setImprimeprecio(Secretaria.DESCUENTO_COBRAR);
            } else if (rdPrecioDescuento.isChecked()) {
                secretaria.setImprimeprecio(Secretaria.PRECIO_MENOS_DESCUENTO);
            } else if (rdPrecioTotal.isChecked()) {
                secretaria.setImprimeprecio(Secretaria.PRECIO_TOTAL);
            }

            boolean podeSalvar = false;
            List<Secretaria> lsSecretaria = secretariaService.buscar(secretaria.getDescsecretaria());

            if (lsSecretaria.isEmpty()) {
                podeSalvar = true;
            } else {
                for (Secretaria s : lsSecretaria) {
                    if (s.getSecretariaId().equals(secretaria.getSecretariaId())) {
                        podeSalvar = true;
                    }
                }
            }

            if (podeSalvar) {
                if (secretaria.getSecretariaId() == null) {
                    secretariaService.suscribir(secretaria);
                    secretariaList.addItem(secretaria);
                } else {
                    secretariaService.actualizacion(secretaria);
                    secretariaList.updateItem(secretaria);
                }
                Messagebox.show(
                        Labels.getLabel("editarSecretariaController.MSG.suscribirOK"),
                        Labels.getLabel("editarSecretariaController.window.title"),
                        Messagebox.OK, Messagebox.INFORMATION);

                closeWindow();

            } else {

                Messagebox.show(
                        Labels.getLabel("MSG.Registro.Existe"),
                        Labels.getLabel("editarSecretariaController.window.title"),
                        Messagebox.OK, Messagebox.EXCLAMATION);

            }
        } catch (Exception ex) {
            log.error("",ex);
            Messagebox.show(
                    Labels.getLabel("MSG.Error"),
                    Labels.getLabel("editarSecretariaController.window.title"),
                    Messagebox.OK, Messagebox.ERROR);

        }
    }

    public void onClick$btnApagar(Event ev) throws InterruptedException {
        try {
            int resp = Messagebox.show(
                    Labels.getLabel("editarSecretariaController.MSG.borrarPergunta"),
                    Labels.getLabel("editarSecretariaController.window.title"),
                    Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);

            if (resp == Messagebox.YES) {

                secretariaService.borrar(secretaria);

                Messagebox.show(
                        Labels.getLabel("editarSecretariaController.MSG.borrarOK"),
                        Labels.getLabel("editarSecretariaController.window.title"),
                        Messagebox.OK, Messagebox.INFORMATION);

                secretariaList.removeItem(secretaria);

                closeWindow();
            }
        } catch (Exception ex) {
            log.error("",ex);
            Messagebox.show(
                    Labels.getLabel("MSG.Error"),
                    Labels.getLabel("editarSecretariaController.window.title"),
                    Messagebox.OK, Messagebox.ERROR);
        }
    }

    public void onClick$btnAdicionarCuponSecretaria(Event ev) throws InterruptedException {
        txtPorcdescuento.setConstraint("no empty");
        txtPorcdescuento.getValue();

        if (txtPorcdescuento.getValueDecimal().compareTo(new BigDecimal("100")) > 0) {
            Clients.wrongValue(txtPorcdescuento, Labels.getLabel("MSG.Porcentaje"));
            return;
        }
        if (chkValidaFolio.isChecked()) {
            txtNumfolioinicio.setConstraint("no empty, no negative, no zero");
            txtNumfoliofinal.setConstraint("no empty, no negative, no zero");

            txtNumfolioinicio.getValue();
            txtNumfoliofinal.getValue();
        }

        try {
            BigDecimal porcdescuento = BigDecimal.valueOf(Double.parseDouble(txtPorcdescuento.getValue()));
            BigDecimal porcdescuentoOutros = BigDecimal.valueOf(Double.parseDouble(txtPorcdescuentoOutros.getValue()));
            BigDecimal porcdescuentoPedagio = BigDecimal.valueOf(Double.parseDouble(txtPorcdescuentoPedagio.getValue()));
            BigDecimal porcdescuentoSeguro = BigDecimal.valueOf(Double.parseDouble(txtPorcdescuentoSeguro.getValue()));
            BigDecimal porcdescuentoTaxaEmbarque = BigDecimal.valueOf(Double.parseDouble(txtPorcdescuentoTaxaEmbarque.getValue()));
            
            Long numfolioinicio = txtNumfolioinicio.getValue();
            Long numfoliofinal = txtNumfoliofinal.getValue();

            if (chkValidaFolio.isChecked() && (numfolioinicio > numfoliofinal)) {
                Messagebox.show(
                        Labels.getLabel("MSG.Folios"),
                        Labels.getLabel("editarSecretariaController.window.title"),
                        Messagebox.OK, Messagebox.EXCLAMATION);
                return;
            }

            Boolean achou = Boolean.FALSE;
            for (CuponSecretaria cds : secretaria.getLsCuponSecretaria()) {
                if (cds.getNumfoliofinal() != null
                        && cds.getNumfolioinicio() != null) {
                    if (cds.getNumfoliofinal().equals(numfoliofinal)
                            && cds.getNumfolioinicio().equals(numfolioinicio)
                            && cds.getPorcdescuento().equals(porcdescuento)) {
                        achou = Boolean.TRUE;
                    }
                }
            }

            if (!achou) {
                CuponSecretaria cd = new CuponSecretaria();
                cd.setActivo(Boolean.TRUE);
                cd.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
                cd.setFecmodif(Calendar.getInstance().getTime());
                cd.setPorcdescuento(porcdescuento);
                cd.setPorcdescuentooutros(porcdescuentoOutros);
                cd.setPorcdescuentopedagio(porcdescuentoPedagio);
                cd.setPorcdescuentoseguro(porcdescuentoSeguro);
                cd.setPorcdescuentotaxaembarque(porcdescuentoTaxaEmbarque);
                
                cd.setNumfolioinicio(numfolioinicio);
                cd.setNumfoliofinal(numfoliofinal);

                if (chkValidaFolio.isChecked()) {
                    int resp = registroDuplicado(numfolioinicio, numfoliofinal);

                    if (resp != 0) {
                        Messagebox.show(
                                (resp == 1) ? Labels.getLabel("MSG.Registro.Existe") : Labels.getLabel("editarSecretariaController.MSG.registroTraslapado"),
                                Labels.getLabel("editarSecretariaController.window.title"),
                                Messagebox.OK, Messagebox.EXCLAMATION);
                        return;
                    }
                } else {
                    if (lsCuponSecretaria.size() >= 1) {
                        Messagebox.show(
                                Labels.getLabel("editarSecretariaController.MSG.pocentaje"),
                                Labels.getLabel("editarSecretariaController.window.title"),
                                Messagebox.OK, Messagebox.EXCLAMATION);
                        return;
                    }
                }

                lsCuponSecretaria.add(cd);
                cuponSecretariaList.setData(lsCuponSecretaria);
                secretaria.setLsCuponSecretaria(lsCuponSecretaria);

                chkValidaFolio.setDisabled(Boolean.TRUE);

                txtPorcdescuento.setConstraint("");
                txtNumfolioinicio.setConstraint("");
                txtNumfoliofinal.setConstraint("");

                txtPorcdescuento.setText(null);
                txtPorcdescuentoOutros.setText(null);
                txtPorcdescuentoPedagio.setText(null);
                txtPorcdescuentoSeguro.setText(null);
                txtPorcdescuentoTaxaEmbarque.setText(null);
                txtNumfolioinicio.setValue(null);
                txtNumfoliofinal.setValue(null);

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

        } catch (Exception ex) {
            log.error("",ex);
            Messagebox.show(
                    Labels.getLabel("MSG.Error"),
                    Labels.getLabel("editarSecretariaController.window.title"),
                    Messagebox.OK, Messagebox.ERROR);
        }
    }

    /**
     *
     * @return
     *  0 - Esta ok
     *  1 - Registro duplicado
     *  2 - Registro traslapado
     * @throws InterruptedException
     */
    private int registroDuplicado(Long folioIni, Long folioFin) throws InterruptedException {
        Collections.sort(lsCuponSecretaria, new Comparator<CuponSecretaria>() {

            public int compare(CuponSecretaria o1, CuponSecretaria o2) {
                return o1.getNumfolioinicio().compareTo(o2.getNumfoliofinal());
            }
        });

        for (CuponSecretaria pv : lsCuponSecretaria) {
            if (!pv.getActivo()) {
                continue;
            }

            if (TraslaparUtil.intersectNum(pv.getNumfolioinicio().longValue(), pv.getNumfoliofinal().longValue(),
                    folioIni, folioFin)) {
                return 2;
            }
        }

        return 0;
    }

    public void onClick$btnRemoverCuponSecretaria(Event ev) {
        CuponSecretaria cd = (CuponSecretaria) cuponSecretariaList.getSelected();
        if (cd != null) {
            cd.setActivo(Boolean.FALSE);
            cd.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
            cd.setFecmodif(Calendar.getInstance().getTime());

            if (cd.getCuponsecretariaId() != null) {
                cuponSecretariaService.borrar(cd);
            }

            lsCuponSecretaria.remove(cd);

            if (lsCuponSecretaria.isEmpty()) {
                btnAdicionarCuponSecretaria.setDisabled(Boolean.FALSE);
                chkValidaFolio.setDisabled(Boolean.FALSE);
            }

            cuponSecretariaList.setData(lsCuponSecretaria);
            secretaria.setLsCuponSecretaria(lsCuponSecretaria);
        }
    }
}
