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

import com.rjconsultores.ventaboletos.entidad.OrgaoConcedente;
import com.rjconsultores.ventaboletos.entidad.Parada;
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 com.rjconsultores.ventaboletos.entidad.TaxaEmbarqueParada;
import com.rjconsultores.ventaboletos.service.OrgaoConcedenteService;
import com.rjconsultores.ventaboletos.service.ParadaService;
import com.rjconsultores.ventaboletos.service.TaxaEmbarqueParadaService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxEstandar;
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.RenderTaxaEmbarqueParada;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Intbox;
import org.zkoss.zul.Radio;

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

    @Autowired
    private TaxaEmbarqueParadaService taxaEmbarqueParadaService;
    @Autowired
    private OrgaoConcedenteService orgaoConcedenteService;
    @Autowired
    private ParadaService paradaService;
    private Parada parada;
    //private TaxaEmbarqueParada taxaEmbarqueParada;
    private List<TaxaEmbarqueParada> lsTaxaEmbarqueParada;
    private List<OrgaoConcedente> lsOrgaoConcedente;
    private MyListbox taxaEmbarqueParadaList;
    private MyComboboxEstandar cmbOrgao;
    private Combobox cmbParada;
    private Button btnApagar;
    private Button btnAdicionarTaxaEmbarqueParada;
    private Intbox txtKm;
    private Radio rdSi;
    private Radio rdNo;
    private MyTextboxDecimal txtValor;
    private static Logger log = Logger.getLogger(EditarTaxaEmbarqueParadaController.class);

    public Button getBtnApagar() {
        return btnApagar;
    }

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

    public Button getBtnAdicionarTaxaEmbarqueParada() {
        return btnAdicionarTaxaEmbarqueParada;
    }

    public void setBtnAdicionarTaxaEmbarqueParada(Button btnAdicionarTaxaEmbarqueParada) {
        this.btnAdicionarTaxaEmbarqueParada = btnAdicionarTaxaEmbarqueParada;
    }

    public List<OrgaoConcedente> getLsOrgaoConcedente() {
        return lsOrgaoConcedente;
    }

    public void setLsOrgaoConcedente(List<OrgaoConcedente> lsOrgaoConcedente) {
        this.lsOrgaoConcedente = lsOrgaoConcedente;
    }

    public List<TaxaEmbarqueParada> getLsTaxaEmbarqueParada() {
        return lsTaxaEmbarqueParada;
    }

    public void setLsTaxaEmbarqueParada(List<TaxaEmbarqueParada> lsTaxaEmbarqueParada) {
        this.lsTaxaEmbarqueParada = lsTaxaEmbarqueParada;
    }

    public MyListbox getTaxaEmbarqueParadaList() {
        return taxaEmbarqueParadaList;
    }

    public void setTaxaEmbarqueParadaList(MyListbox taxaEmbarqueParadaList) {
        this.taxaEmbarqueParadaList = taxaEmbarqueParadaList;
    }

    public MyTextboxDecimal getTxtValor() {
        return txtValor;
    }

    public void setTxtValor(MyTextboxDecimal txtValor) {
        this.txtValor = txtValor;
    }

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

        lsOrgaoConcedente = orgaoConcedenteService.obtenerTodos();

        super.doAfterCompose(comp);

        parada = (Parada) Executions.getCurrent().getArg().get("parada");

        taxaEmbarqueParadaList.setItemRenderer(new RenderTaxaEmbarqueParada());
        lsTaxaEmbarqueParada = new ArrayList<TaxaEmbarqueParada>();

        if (parada.getParadaId() != null) {

            lsTaxaEmbarqueParada = taxaEmbarqueParadaService.buscarPorLocalidade(parada);
            taxaEmbarqueParadaList.setData(lsTaxaEmbarqueParada);

            cmbParada.setText(parada.getDescparada());
            cmbParada.setDisabled(Boolean.TRUE);
        }

        onClick$rdSi(null);
    }

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

        try {
            if (lsTaxaEmbarqueParada.isEmpty()) {
                Messagebox.show(
                        Labels.getLabel("editarTaxaEmbarqueParadaController.MSG.necessaitaInfromar.value"),
                        Labels.getLabel("editarTaxaEmbarqueParadaController.window.title"),
                        Messagebox.OK, Messagebox.EXCLAMATION);
                return;
            }

            for (TaxaEmbarqueParada kmParada : lsTaxaEmbarqueParada) {
                if (kmParada.getTaxaembarqueparadaId() == null) {
                    taxaEmbarqueParadaService.suscribir(kmParada);
                }
            }
            Messagebox.show(
                    Labels.getLabel("editarTaxaEmbarqueParadaController.MSG.suscribirOK"),
                    Labels.getLabel("editarTaxaEmbarqueParadaController.window.title"),
                    Messagebox.OK, Messagebox.INFORMATION);

            closeWindow();


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

        }
    }

    public void onClick$rdNo(Event ev) {
        txtKm.setConstraint("");
        txtKm.setText("");
        txtKm.setDisabled(true);
    }

    public void onClick$rdSi(Event ev) {
        txtKm.setConstraint("no empty, no zero, no negative");
        txtKm.setDisabled(false);
    }

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

        cmbParada.getValue();
        cmbOrgao.getValue();
        txtKm.getValue();
        txtValor.getValue();


        if (lsTaxaEmbarqueParada.isEmpty()) {
            if (parada == null) {
                parada = (Parada) cmbParada.getSelectedItem().getValue();
            }
            lsTaxaEmbarqueParada = taxaEmbarqueParadaService.buscarPorLocalidade(parada);
            taxaEmbarqueParadaList.setData(lsTaxaEmbarqueParada);
        }

        //ChecandoDuplicado
        boolean existeKmOrgao = false;
        boolean existeFixo = false;
        for (TaxaEmbarqueParada kmParada : lsTaxaEmbarqueParada) {
            if (rdSi.isChecked()) {
                if (kmParada.getOrgaoconcedenteId().equals((OrgaoConcedente) cmbOrgao.getSelectedItem().getValue())
                        && kmParada.getIndtipo() == 'F') {
                    existeFixo = true;
                    break;
                }
                if (txtKm.getValue() != null
                        && kmParada.getKmate() != null
                        && kmParada.getKmate().equals(txtKm.getValue())
                        && kmParada.getOrgaoconcedenteId().equals((OrgaoConcedente) cmbOrgao.getSelectedItem().getValue())) {
                    existeKmOrgao = true;
                    break;
                }
            } else {
                if (kmParada.getOrgaoconcedenteId().equals((OrgaoConcedente) cmbOrgao.getSelectedItem().getValue())) {
                    existeFixo = true;
                    break;
                }
            }
        }

        if (existeKmOrgao) {
            Messagebox.show(
                    Labels.getLabel("editarTaxaEmbarqueParadaController.MSG.existeKm"),
                    Labels.getLabel("editarTaxaEmbarqueParadaController.window.title"),
                    Messagebox.OK, Messagebox.INFORMATION);
            limparInput();
            return;
        }

        if (existeFixo) {
            Messagebox.show(
                    Labels.getLabel("editarTaxaEmbarqueParadaController.MSG.existeFixo"),
                    Labels.getLabel("editarTaxaEmbarqueParadaController.window.title"),
                    Messagebox.OK, Messagebox.INFORMATION);
            limparInput();
            return;
        }

        TaxaEmbarqueParada txParada = new TaxaEmbarqueParada();

        Parada pr = new Parada();
        if (cmbParada.getSelectedItem() == null) {
            pr = parada;
        } else {
            pr = (Parada) cmbParada.getSelectedItem().getValue();
        }

        txParada.setParadaId(pr);
        txParada.setOrgaoconcedenteId((OrgaoConcedente) cmbOrgao.getSelectedItem().getValue());
        txParada.setKmate(txtKm.getValue());
        txParada.setValortaxa(txtValor.getValueDecimal());
        txParada.setActivo(true);
        txParada.setFecmodif(Calendar.getInstance().getTime());
        txParada.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
        txParada.setIndtipo(rdSi.isChecked() ? 'K' : 'F');

        lsTaxaEmbarqueParada.add(txParada);
        taxaEmbarqueParadaList.setData(lsTaxaEmbarqueParada);

        cmbParada.setDisabled(Boolean.TRUE);
        limparInput();
        if (rdSi.isChecked()) {
            onClick$rdSi(null);
        } else {
            onClick$rdNo(null);
        }

    }

    private void limparInput() {
        txtKm.setConstraint("");
        txtValor.setConstraint("");
        txtKm.setText("");
        txtValor.setText("");
        txtKm.setConstraint("no empty, no zero, no negative");
        txtValor.setConstraint("no empty, no zero, no negative");
    }

    public void onClick$btnRemoverTaxaEmbarqueParada(Event ev) {
        TaxaEmbarqueParada txParada = (TaxaEmbarqueParada) taxaEmbarqueParadaList.getSelected();
        if (txParada != null) {
            txParada.setActivo(Boolean.FALSE);
            txParada.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
            txParada.setFecmodif(Calendar.getInstance().getTime());

            taxaEmbarqueParadaService.actualizacion(txParada);

            lsTaxaEmbarqueParada.remove(txParada);
            taxaEmbarqueParadaList.setData(lsTaxaEmbarqueParada);

        }
    }
}
