package com.rjconsultores.ventaboletos.web.gui.controladores.pagoconductor;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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.Combobox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Datebox;
import org.zkoss.zul.Intbox;
import org.zkoss.zul.Textbox;

import com.rjconsultores.ventaboletos.entidad.Autobus;
import com.rjconsultores.ventaboletos.entidad.ClaseServicio;
import com.rjconsultores.ventaboletos.entidad.Conductor;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.Marca;
import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.entidad.TarjetaViaje;
import com.rjconsultores.ventaboletos.service.AutobusService;
import com.rjconsultores.ventaboletos.service.ClaseServicioService;
import com.rjconsultores.ventaboletos.service.ConductorService;
import com.rjconsultores.ventaboletos.service.EmpresaService;
import com.rjconsultores.ventaboletos.service.MarcaService;
import com.rjconsultores.ventaboletos.service.ParadaService;
import com.rjconsultores.ventaboletos.service.TarjetaViajeService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;

@Controller("editarTarjetaViajeController")
@Scope("prototype")
public class EditarTarjetaViajeController extends MyGenericForwardComposer {

    private TarjetaViaje tarjetaViaje;
    private MyListbox tarjetaViajeList;
    @Autowired
    private TarjetaViajeService tarjetaViajeService;
    private static Logger log = Logger.getLogger(EditarTarjetaViajeController.class);
    private List<Empresa> lsEmpresa;
    private List<Autobus> lsAutobus;
    private List<ClaseServicio> lsClaseServicio;
    private List<Conductor> lsConductor;
    @Autowired
    private EmpresaService empresaService;
    @Autowired
    private AutobusService autobusService;
    @Autowired
    private ParadaService paradaService;
    @Autowired
    private ClaseServicioService claseServicioService;
    @Autowired
    private ConductorService conductorService;
    private Intbox txtCorrida;
    private Datebox fecTarjeta;
    private Textbox txtOrigen;
    private Textbox txtDestino;
    private Combobox cmbEmpresa;
    private Combobox cmbAutobus;
    private Combobox cmbRuta;
    private Intbox kms;
    private Combobox cmbClaseServicio;
    private Combobox cmbConductor;
    private Combobox cmbConductor1;
    private Intbox kmsOperador;
    private Button btnBusquedaCorrida;
    private Button btnNovo;
    private Button btnSalvar;
    private List<Marca> lsMarca;
    private BigDecimal tarjetaViajeRef;
    private TarjetaViaje tarjetaViajeAux;
    private Combobox cmbMarcas;
    @Autowired
    private MarcaService marcaService;
    private Combobox cmbSecuencia;
    private List<String> lsSecuencia;
    private BusquedaTarjetaViajeController busquedaTarjetaViajeController;
    private Button btnApagar;

    public Button getBtnApagar() {
        return btnApagar;
    }

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

    public List<String> getLsSecuencia() {
        return lsSecuencia;
    }

    public void setLsSecuencia(List<String> lsSecuencia) {
        this.lsSecuencia = lsSecuencia;
    }

    public Combobox getCmbSecuencia() {
        return cmbSecuencia;
    }

    public void setCmbSecuencia(Combobox cmbSecuencia) {
        this.cmbSecuencia = cmbSecuencia;
    }

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

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

    public MarcaService getMarcaService() {
        return marcaService;
    }

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

    public Combobox getCmbMarcas() {
        return cmbMarcas;
    }

    public void setCmbMarcas(Combobox cmbMarcas) {
        this.cmbMarcas = cmbMarcas;
    }

    public Button getBtnSalvar() {
        return btnSalvar;
    }

    public void setBtnSalvar(Button btnSalvar) {
        this.btnSalvar = btnSalvar;
    }

    public BigDecimal getTarjetaViajeRef() {
        return tarjetaViajeRef;
    }

    public void setTarjetaViajeRef(BigDecimal tarjetaViajeRef) {
        this.tarjetaViajeRef = tarjetaViajeRef;
    }

    public Button getBtnNovo() {
        return btnNovo;
    }

    public void setBtnNovo(Button btnNovo) {
        this.btnNovo = btnNovo;
    }

    public Button getBtnBusquedaCorrida() {
        return btnBusquedaCorrida;
    }

    public void setBtnBusquedaCorrida(Button btnBusquedaCorrida) {
        this.btnBusquedaCorrida = btnBusquedaCorrida;
    }

    public Combobox getCmbEmpresa() {
        return cmbEmpresa;
    }

    public void setCmbEmpresa(Combobox cmbEmpresa) {
        this.cmbEmpresa = cmbEmpresa;
    }

    public Combobox getCmbAutobus() {
        return cmbAutobus;
    }

    public void setCmbAutobus(Combobox cmbAutobus) {
        this.cmbAutobus = cmbAutobus;
    }

    public Combobox getCmbRuta() {
        return cmbRuta;
    }

    public void setCmbRuta(Combobox cmbRuta) {
        this.cmbRuta = cmbRuta;
    }

    public Intbox getKms() {
        return kms;
    }

    public void setKms(Intbox kms) {
        this.kms = kms;
    }

    public Combobox getCmbClaseServicio() {
        return cmbClaseServicio;
    }

    public void setCmbClaseServicio(Combobox cmbClaseServicio) {
        this.cmbClaseServicio = cmbClaseServicio;
    }

    public Combobox getCmbConductor() {
        return cmbConductor;
    }

    public void setCmbConductor(Combobox cmbConductor) {
        this.cmbConductor = cmbConductor;
    }

    public Combobox getCmbConductor1() {
        return cmbConductor1;
    }

    public void setCmbConductor1(Combobox cmbConductor1) {
        this.cmbConductor1 = cmbConductor1;
    }

    public Intbox getKmsOperador() {
        return kmsOperador;
    }

    public void setKmsOperador(Intbox kmsOperador) {
        this.kmsOperador = kmsOperador;
    }

    public Textbox getTxtOrigen() {
        return txtOrigen;
    }

    public void setTxtOrigen(Textbox txtOrigen) {
        this.txtOrigen = txtOrigen;
    }

    public Textbox getTxtDestino() {
        return txtDestino;
    }

    public void setTxtDestino(Textbox txtDestino) {
        this.txtDestino = txtDestino;
    }

    public Intbox getTxtCorrida() {
        return txtCorrida;
    }

    public void setTxtCorrida(Intbox txtCorrida) {
        this.txtCorrida = txtCorrida;
    }

    public TarjetaViaje getTarjetaViaje() {
        return tarjetaViaje;
    }

    public void setTarjetaViaje(TarjetaViaje tarjeta) {
        this.tarjetaViaje = tarjeta;
    }

    public MyListbox getTarjetaViajeList() {
        return tarjetaViajeList;
    }

    public void setTarjetaViajeList(MyListbox tarjetaViajeList) {
        this.tarjetaViajeList = tarjetaViajeList;
    }

    public TarjetaViajeService getTarjetaViajeService() {
        return tarjetaViajeService;
    }

    public void setTarjetaViajeService(TarjetaViajeService tarjetaViajeService) {
        this.tarjetaViajeService = tarjetaViajeService;
    }

    public List<Empresa> getLsEmpresa() {
        return lsEmpresa;
    }

    public void setLsEmpresa(List<Empresa> lsEmpresa) {
        this.lsEmpresa = lsEmpresa;
    }

    public List<Autobus> getLsAutobus() {
        return lsAutobus;
    }

    public void setLsAutobus(List<Autobus> lsAutobus) {
        this.lsAutobus = lsAutobus;
    }

    public List<ClaseServicio> getLsClaseServicio() {
        return lsClaseServicio;
    }

    public void setLsClaseServicio(List<ClaseServicio> lsClaseServicio) {
        this.lsClaseServicio = lsClaseServicio;
    }

    public List<Conductor> getLsConductor() {
        return lsConductor;
    }

    public void setLsConductor(List<Conductor> lsConductor) {
        this.lsConductor = lsConductor;
    }

    public EmpresaService getEmpresaService() {
        return empresaService;
    }

    public void setEmpresaService(EmpresaService empresaService) {
        this.empresaService = empresaService;
    }

    public AutobusService getAutobusService() {
        return autobusService;
    }

    public void setAutobusService(AutobusService autobusService) {
        this.autobusService = autobusService;
    }

    public ParadaService getParadaService() {
        return paradaService;
    }

    public void setParadaService(ParadaService paradaService) {
        this.paradaService = paradaService;
    }

    public ClaseServicioService getClaseServicioService() {
        return claseServicioService;
    }

    public void setClaseServicioService(ClaseServicioService claseServicioService) {
        this.claseServicioService = claseServicioService;
    }

    public ConductorService getConductorService() {
        return conductorService;
    }

    public void setConductorService(ConductorService conductorService) {
        this.conductorService = conductorService;
    }

    public Datebox getFecTarjeta() {
        return fecTarjeta;
    }

    public void setFecTarjeta(Datebox fecTarjeta) {
        this.fecTarjeta = fecTarjeta;
    }

    @Override
    public void doAfterCompose(Component comp) throws Exception {
        tarjetaViaje = (TarjetaViaje) Executions.getCurrent().getArg().get("tarjetaViaje");
        tarjetaViajeList = (MyListbox) Executions.getCurrent().getArg().get("tarjetaViajeList");
        tarjetaViajeAux = (TarjetaViaje) Executions.getCurrent().getArg().get("tarjetaViajeAux");
        busquedaTarjetaViajeController = (BusquedaTarjetaViajeController) Executions.getCurrent().getArg().get("buesquedaTarjetaController");
        if (tarjetaViaje == null) {
            tarjetaViaje = tarjetaViajeAux;
        }
        super.doAfterCompose(comp);
        if (tarjetaViaje.getTarjetaviajeId() != null) {
            if ((tarjetaViaje.getIndstatustarjeta().equals("N") || tarjetaViaje.getIndstatustarjeta().equals("S")) && tarjetaViaje.getFecenvionomina() == null) {
                cmbEmpresa.setDisabled(true);
                kms.setDisabled(true);
                cmbClaseServicio.setDisabled(true);
                kmsOperador.setDisabled(true);
                cmbMarcas.setDisabled(true);
                cmbAutobus.setDisabled(false);
                txtOrigen.setDisabled(true);
                txtDestino.setDisabled(true);
                txtCorrida.setDisabled(true);
                fecTarjeta.setDisabled(true);
                cmbSecuencia.setDisabled(true);
                btnBusquedaCorrida.setVisible(false);
            } else if (tarjetaViaje.getIndstatustarjeta().equals("B") || tarjetaViaje.getFecenvionomina() != null) {
                if (tarjetaViaje.getFecenvionomina() != null) {
                    btnNovo.setDisabled(true);
                } else if (tarjetaViaje.getIndstatustarjeta().equals("B")) {
                    btnNovo.setDisabled(false);
                }
                btnBusquedaCorrida.setVisible(false);
                cmbSecuencia.setDisabled(true);
                btnApagar.setVisible(false);
                cmbMarcas.setDisabled(true);
                txtOrigen.setDisabled(true);
                txtDestino.setDisabled(true);
                fecTarjeta.setDisabled(true);
                txtCorrida.setDisabled(true);
                cmbAutobus.setDisabled(true);
                cmbConductor.setDisabled(true);
                cmbConductor1.setDisabled(true);
                cmbEmpresa.setDisabled(true);
                cmbClaseServicio.setDisabled(true);
                kms.setDisabled(true);
                kmsOperador.setDisabled(true);
                btnNovo.setVisible(true);
                btnSalvar.setVisible(false);
            }
            if (tarjetaViaje.getFecHorSalida()!= null) {
                fecTarjeta.setValue(tarjetaViaje.getFecHorSalida());
            }
        }
        lsSecuencia = new ArrayList<String>();
        lsSecuencia.add(Labels.getLabel("editarTarjetaController.primaria").toUpperCase());
        lsSecuencia.add(Labels.getLabel("editarTarjetaController.secundaria").toUpperCase());
        if (tarjetaViaje.getNumsecuencia() != null) {
            Comboitem item = new Comboitem();
            item.setValue(getDescSeq(tarjetaViaje.getNumsecuencia().shortValue()).toUpperCase());
            item.setLabel(getDescSeq(tarjetaViaje.getNumsecuencia().shortValue()).toUpperCase());
            item.setParent(cmbSecuencia);
            cmbSecuencia.setSelectedItem(item);
        }
        lsMarca = marcaService.buscarMarcaPorEmpresa(UsuarioLogado.getUsuarioLogado().getEmpresa());
        lsEmpresa = empresaService.buscarTodosExceto(UsuarioLogado.getUsuarioLogado().getEmpresa(),-1);
        lsAutobus = autobusService.obtenerTodos();
        lsClaseServicio = claseServicioService.buscarTodosExceto(-1);
        lsConductor = conductorService.obtenerTodos();
    }

    private String getDescSeq(Short numSeq) {
        if (numSeq == null) {
            return "";
        }

        if (numSeq.shortValue() == 1) {
            return Labels.getLabel("editarTarjetaController.primaria");
        } else {
            return Labels.getLabel("editarTarjetaController.secundaria");
        }
    }

    public void onClick$btnBusquedaCorrida(Event ev) {
        Map args = new HashMap();
        args.put("tarjetaViaje", tarjetaViaje);
        args.put("editarTarjetaViajeController", this);

        openWindow("/gui/pago_conductor/busquedaCorridaTarjetaViaje.zul",
                Labels.getLabel("editarPricingController.windowCorrida.title"),
                args, MODAL);
    }

    public void onClick$btnSalvar(Event ev) throws InterruptedException {
        cmbEmpresa.getValue();
        cmbAutobus.getValue();
        txtCorrida.getValue();
        txtOrigen.getValue();
        txtDestino.getValue();
        fecTarjeta.getValue();
        kms.getValue();
        cmbClaseServicio.getValue();
        cmbConductor.getValue();
        kmsOperador.getValue();
        try {
            if (tarjetaViajeAux != null) {
                if (cmbSecuencia.getSelectedItem() != null) {
                    String sec = (String) cmbSecuencia.getSelectedItem().getValue();
                    if (sec.toUpperCase().equals(Labels.getLabel("editarTarjetaController.primaria").toUpperCase())) {
                        tarjetaViajeAux.setNumsecuencia(1);
                    } else {
                        tarjetaViajeAux.setNumsecuencia(2);
                    }
                }
                tarjetaViajeAux.setIndstatustarjeta("M");
                tarjetaViajeAux.setFoliotarjetaviaje(null);
                tarjetaViajeAux.setFecenvionomina(null);
                tarjetaViajeAux.setFecmodif(new Date());
                tarjetaViajeAux.setMarca(cmbMarcas.getSelectedItem() != null ? (Marca) cmbMarcas.getSelectedItem().getValue() : null);
                tarjetaViajeAux.setEmpresa(cmbEmpresa.getSelectedItem() != null ? (Empresa) cmbEmpresa.getSelectedItem().getValue() : null);
                tarjetaViajeAux.setConductor((Conductor) cmbConductor.getSelectedItem().getValue());
                if (cmbConductor1.getSelectedItem() != null) {
                    tarjetaViajeAux.setConductor1((Conductor) cmbConductor1.getSelectedItem().getValue());
                } else {
                    tarjetaViajeAux.setConductor1(null);
                }
                tarjetaViajeAux.setClaseServicio(cmbClaseServicio.getSelectedItem() != null ? (ClaseServicio) cmbClaseServicio.getSelectedItem().getValue() : null);
                tarjetaViajeAux.setAutobus(cmbAutobus.getSelectedItem() != null ? (Autobus) cmbAutobus.getSelectedItem().getValue() : null);
                tarjetaViajeAux.setKmPagoConductor(new BigDecimal(kms.getValue()).setScale(0));
                tarjetaViajeAux.setKmReal(new BigDecimal(kms.getValue()).setScale(0));
                tarjetaViajeAux.setOrigen(txtOrigen.getValue());
                tarjetaViajeAux.setDestino(txtDestino.getValue());
                tarjetaViajeAux.setNumCorrida(txtCorrida.getValue());
                tarjetaViajeAux.setFecHorSalida(fecTarjeta.getValue());
                tarjetaViajeAux.setFecInicial(fecTarjeta.getValue());
                tarjetaViajeService.suscribir(tarjetaViajeAux);
                busquedaTarjetaViajeController.refreshLista();
            } else {
                tarjetaViaje.setIndstatustarjeta("S");
                tarjetaViajeService.actualizacion(tarjetaViaje);
                busquedaTarjetaViajeController.refreshLista();
            }
            Messagebox.show(Labels.getLabel("editarTarjetaController.MSG.suscribirOK"),
                    Labels.getLabel("busquedaTarjetaViajeController.window.title"),
                    Messagebox.OK, Messagebox.INFORMATION);

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

    public void onClick$btnNovo(Event e) {
        if (tarjetaViaje == null) {
            return;
        }
        Map args = new HashMap();
        TarjetaViaje t = new TarjetaViaje();
        t.setTarjetaViajeRef(new BigDecimal(tarjetaViaje.getTarjetaviajeId()));
        t.setIndRebote(tarjetaViaje.getIndRebote());
        args.put("tarjetaViajeAux", t);
        args.put("tarjetaViajeList", tarjetaViajeList);
        args.put("buesquedaTarjetaController", busquedaTarjetaViajeController);
        openWindow("/gui/pago_conductor/editarTarjetaViaje.zul",
                Labels.getLabel("busquedaTarjetaViajeController.window.title"), args, MODAL);
        this.closeWindow();
    }

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

        if (resp == Messagebox.YES) {

            tarjetaViajeService.borrar(tarjetaViaje);

            Messagebox.show(Labels.getLabel("editarTarjetaViajeController.MSG.borrarOK"),
                    Labels.getLabel("editarTarjetaViajeController.window.title"),
                    Messagebox.OK, Messagebox.INFORMATION);
            tarjetaViajeList.updateItem(tarjetaViaje);

            closeWindow();
        }
    }
}
