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

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.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.Combobox;
import org.zkoss.zul.Intbox;
import org.zkoss.zul.Row;

import com.rjconsultores.ventaboletos.constantes.TipoSeguro;
import com.rjconsultores.ventaboletos.entidad.OrgaoConcedente;
import com.rjconsultores.ventaboletos.entidad.SeguroKm;
import com.rjconsultores.ventaboletos.service.OrgaoConcedenteService;
import com.rjconsultores.ventaboletos.service.SeguroKmService;
import com.rjconsultores.ventaboletos.utilerias.ApplicationProperties;
import com.rjconsultores.ventaboletos.utilerias.CustomEnum;
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.RenderSeguroKm;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderSeguroSemTpp;

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

    @Autowired
    private SeguroKmService seguroKmService;
    @Autowired
    private OrgaoConcedenteService orgaoConcedenteService;
    private OrgaoConcedente orgao;
    //  private SeguroKm seguroKm;
    private List<SeguroKm> lsSeguroKm;
    private List<OrgaoConcedente> lsOrgaoConcedente;
    private MyListbox seguroKmList;
    private MyListbox seguroKmListTpm;
    private MyComboboxEstandar cmbOrgao;
    private Button btnApagar;
    private Button btnAdicionarSeguroKm;
    private Intbox txtKm;
    private Intbox txtKmSemTpp;
    private MyTextboxDecimal txtValor;
    private static Logger log = LogManager.getLogger(EditarSeguroKmController.class);
    private Combobox cmbTipoSeguro;
    private List<TipoSeguro> lsTipoSeguro = new ArrayList<TipoSeguro>();
    private Boolean exibeTpp;
    private Row rowExibeTpp;
    private Row columTpp;
    private Row columSemTpp;
    
	public SeguroKmService getSeguroKmService() {
		return seguroKmService;
	}

	public void setSeguroKmService(SeguroKmService seguroKmService) {
		this.seguroKmService = seguroKmService;
	}

	public MyListbox getSeguroKmListTpm() {
		return seguroKmListTpm;
	}

	public void setSeguroKmListTpm(MyListbox seguroKmListTpm) {
		this.seguroKmListTpm = seguroKmListTpm;
	}

	public Intbox getTxtKm() {
		return txtKm;
	}

	public void setTxtKm(Intbox txtKm) {
		this.txtKm = txtKm;
	}

	public MyTextboxDecimal getTxtValor() {
		return txtValor;
	}

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

	public Row getRowExibeTpp() {
		return rowExibeTpp;
	}

	public void setRowExibeTpp(Row rowExibeTpp) {
		this.rowExibeTpp = rowExibeTpp;
	}

	public Combobox getCmbTipoSeguro() {
		return cmbTipoSeguro;
	}

	public void setCmbTipoSeguro(Combobox cmbTipoSeguro) {
		this.cmbTipoSeguro = cmbTipoSeguro;
	}

	public List<TipoSeguro> getLsTipoSeguro() {
		return lsTipoSeguro;
	}

	public void setLsTipoSeguro(List<TipoSeguro> lsTipoSeguro) {
		this.lsTipoSeguro = lsTipoSeguro;
	}

	public Button getBtnApagar() {
        return btnApagar;
    }

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

    public Button getBtnAdicionarSeguroKm() {
        return btnAdicionarSeguroKm;
    }

    public void setBtnAdicionarSeguroKm(Button btnAdicionarSeguroKm) {
        this.btnAdicionarSeguroKm = btnAdicionarSeguroKm;
    }

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

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

    public List<SeguroKm> getLsSeguroKm() {
        return lsSeguroKm;
    }

    public void setLsSeguroKm(List<SeguroKm> lsSeguroKm) {
        this.lsSeguroKm = lsSeguroKm;
    }

    public MyListbox getSeguroKmList() {
        return seguroKmList;
    }

    public void setSeguroKmList(MyListbox seguroKmList) {
        this.seguroKmList = seguroKmList;
    }

    public OrgaoConcedente getOrgao() {
        return orgao;
    }

    public void setOrgao(OrgaoConcedente orgao) {
        this.orgao = orgao;
    }

    @Override
    public void doAfterCompose(Component comp) throws Exception {
    	exibeTpp = ApplicationProperties.getInstance().isCustomHabilitado(CustomEnum.EXIBE_TPP.getDescricao());
        lsOrgaoConcedente = orgaoConcedenteService.obtenerTodos();

        super.doAfterCompose(comp);
        
        lsTipoSeguro.add(TipoSeguro.SEGURO);
        lsTipoSeguro.add(TipoSeguro.TPP);

        orgao = (OrgaoConcedente) Executions.getCurrent().getArg().get("orgao");
        //seguroKm = (SeguroKm) Executions.getCurrent().getArg().get("seguroKm");

    	seguroKmList.setItemRenderer(new RenderSeguroKm());
    	seguroKmListTpm.setItemRenderer(new RenderSeguroSemTpp());

    	lsSeguroKm = new ArrayList<SeguroKm>();

        if (orgao != null
                && orgao.getOrgaoConcedenteId() != null) {
            lsSeguroKm = seguroKmService.buscarPorOrgao(orgao);
            seguroKmList.setData(lsSeguroKm);
            seguroKmListTpm.setData(lsSeguroKm);
            cmbOrgao.setDisabled(Boolean.TRUE);
            cmbOrgao.setValue(orgao.getDescOrgao());
        }
        
        if (!exibeTpp) {
        	seguroKmList.setVisible(true);
        	seguroKmListTpm.setVisible(false);
        	rowExibeTpp.setVisible(false);
        	columTpp.setVisible(true);
        	columSemTpp.setVisible(false);
        	txtKm.setVisible(true);
        	txtKmSemTpp.setVisible(false);
        } else {
        	seguroKmList.setVisible(false);
        	seguroKmListTpm.setVisible(true);        	
        	rowExibeTpp.setVisible(true);
        	columTpp.setVisible(false);
        	columSemTpp.setVisible(true);
        	txtKm.setVisible(false);
        	txtKmSemTpp.setVisible(true);
        }
    }

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

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

            for (SeguroKm km : lsSeguroKm) {
                if (km.getSegurokmId() == null) {
                    seguroKmService.suscribir(km);
                }
            }
            Messagebox.show(
                    Labels.getLabel("editarSeguroKmController.MSG.suscribirOK"),
                    Labels.getLabel("editarSeguroKmController.window.title"),
                    Messagebox.OK, Messagebox.INFORMATION);

            closeWindow();


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

        }
    }

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

        if (lsSeguroKm.isEmpty()) {

            lsSeguroKm = seguroKmService.buscarPorOrgao((OrgaoConcedente) cmbOrgao.getSelectedItem().getValue());
            seguroKmList.setData(lsSeguroKm);
            seguroKmListTpm.setData(lsSeguroKm);
        }

        //ChecandoDuplicado
        boolean existe = false;
        for (SeguroKm km : lsSeguroKm) {
            if (txtKm.isVisible() && km.getKmate().equals(txtKm.getValue()) && km.getTipoSeguro().equals(TipoSeguro.SEGURO)) {
                existe = true;
            }
            
            if (txtKmSemTpp.isVisible() && km.getKmate().equals(txtKmSemTpp.getValue()) && km.getTipoSeguro().equals(cmbTipoSeguro.getValue())) {
            	existe = true;
            }
        }

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

        SeguroKm km = new SeguroKm();
        km.setOrgaoconcedente((OrgaoConcedente) cmbOrgao.getSelectedItem().getValue());
        km.setTipoSeguro(cmbTipoSeguro.getSelectedItem() != null ? cmbTipoSeguro.getSelectedItem().getLabel() : TipoSeguro.SEGURO.toString());
        if (!exibeTpp) {
        	km.setKmate(txtKm.getValue());
        } else {
        	km.setKmate(txtKmSemTpp.getValue());        	
        }
        km.setValortaxa(txtValor.getValueDecimal());
        km.setActivo(true);
        km.setFecmodif(Calendar.getInstance().getTime());
        km.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());

        lsSeguroKm.add(km);
        seguroKmList.setData(lsSeguroKm);
        seguroKmListTpm.setData(lsSeguroKm);

        cmbOrgao.setDisabled(Boolean.TRUE);
        limparInput();

    }

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

    public void onClick$btnRemoverSeguroKm(Event ev) {
        SeguroKm cd = (SeguroKm) seguroKmList.getSelected();
        if (cd != null) {
            cd.setActivo(Boolean.FALSE);
            cd.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
            cd.setFecmodif(Calendar.getInstance().getTime());
            seguroKmService.actualizacion(cd);

            lsSeguroKm.remove(cd);
            seguroKmList.setData(lsSeguroKm);
        }
        cd = (SeguroKm) seguroKmListTpm.getSelected();
        if (cd != null) {
        	cd.setActivo(Boolean.FALSE);
        	cd.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
        	cd.setFecmodif(Calendar.getInstance().getTime());
        	seguroKmService.actualizacion(cd);
        	
        	lsSeguroKm.remove(cd);
        	seguroKmListTpm.setData(lsSeguroKm);
        }
    }
}
