package br.com.controlefrota.bean;

import br.com.controlefrota.dao.AreaDAO;
import br.com.controlefrota.dao.MotoristaDAO;
import br.com.controlefrota.dao.CarroDAO;
import br.com.controlefrota.dao.OrdemDAO;
import br.com.controlefrota.domain.Area;
import br.com.controlefrota.domain.Carro;
import br.com.controlefrota.domain.Motorista;
import br.com.controlefrota.domain.Ordem;
import br.com.controlefrota.util.FacesUtil;
import java.io.Serializable;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import org.primefaces.context.RequestContext;
import org.primefaces.event.SelectEvent;

@ManagedBean(name = "cadastroOrdemIndividualBean")
@ViewScoped
public class CadastroOrdemIndividualBean implements Serializable {

    private static final long serialVersionUID = 1L;

    private Ordem ordemCadastro;

    private Date dataAtual;

    private Long codigoMotorista = 0L;
    private Integer codigoArea = 0;
    private Integer codigoCarro = 0;

    private Long numeroOrdem = 0L;
    private String placaCarro = "";
    private String descricaoCarro = "";
    private Long kmAnterior = 0L;
    private String observacao = "";
    private Date dataReferencia = null;
    public String finalidade = "";
    private String destino = "";
    private String nomeTransportadora = "";

    private List<Motorista> todosMotoristas;
    private List<Motorista> filteredMotors;
    private Motorista motoristaSelecionado;
    private List<Area> todasAreas;
    private List<Area> filteredArea;
    private Area areaSelecionada;
    private List<Carro> todosVeiculos;
    private List<Carro> filteredVeiculo;
    private Carro carroSelecionado;

    public void carregarCadastro() {
        dataAtual = Calendar.getInstance().getTime();
        ordemCadastro = new Ordem();
        ordemCadastro.setNumeroOrdem(0L);

    }

    public void preparaNovo() {

        try {
            ordemCadastro = new Ordem();
            OrdemDAO dao = new OrdemDAO();
            numeroOrdem = Long.valueOf(String.valueOf(dao.getNumeroOrdem()));
            nomeTransportadora = "SOLAR(PRÓPRIA)";

            // Atualiza botões
            RequestContext.getCurrentInstance().update("frmBtSalvar");
            RequestContext.getCurrentInstance().update("frmBtCancel");
            RequestContext.getCurrentInstance().update("frmBtNovo");

        } catch (SQLException ex) {
            Logger.getLogger(CadastroOrdemIndividualBean.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void onDateSelect(SelectEvent event) {
        SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
        String dataString = format.format(event.getObject());
        try {
            dataReferencia = format.parse(dataString);
        } catch (ParseException e) {
            FacesUtil.adicionarMsgErro("Erro ao converter data: " + e.getMessage());
        }
    }

    public void limpar() {
        ordemCadastro = new Ordem();

        numeroOrdem = 0L;
        codigoArea = 0;
        codigoCarro = 0;
        codigoMotorista = 0L;
        placaCarro = "";
        descricaoCarro = "";
        kmAnterior = 0L;
        observacao = "";
        dataReferencia = null;
        finalidade = "";
        destino = "";
        nomeTransportadora = "";

        motoristaSelecionado = new Motorista();
        areaSelecionada = new Area();
        carroSelecionado = new Carro();

        filteredArea = null;
        filteredMotors = null;
        filteredVeiculo = null;

        RequestContext.getCurrentInstance().update("frmBtSalvar");
        RequestContext.getCurrentInstance().update("frmBtCancel");
        RequestContext.getCurrentInstance().update("frmBtNovo");

    }

    public boolean salvarOrdem() {

        try {

            if (validaCampos()) {

                ordemCadastro.setNumeroOrdem(numeroOrdem);
                ordemCadastro.setCodigoArea(areaSelecionada.getCodigo());
                ordemCadastro.setCodigoMotorista(motoristaSelecionado.getCodigo());
                ordemCadastro.setCodigoVeiculo(carroSelecionado.getCodigo());
                ordemCadastro.setDataAgendamento(dataReferencia.getTime());
                ordemCadastro.setDataCriacao(dataAtual.getTime());
                ordemCadastro.setDescricaoVeiculo(carroSelecionado.getDescricaoModelo());
                ordemCadastro.setDestino(ordemCadastro.getDestino());
                ordemCadastro.setFinalidade(ordemCadastro.getFinalidade());
                ordemCadastro.setKmAnterior(kmAnterior);
                ordemCadastro.setNomeMotorista(motoristaSelecionado.getNome());
                ordemCadastro.setNomeTransportadora(nomeTransportadora);
                ordemCadastro.setObservacoes(ordemCadastro.getObservacoes());
                ordemCadastro.setPlacaVeiculo(carroSelecionado.getPlaca());
                ordemCadastro.setStatusOrdem("A");
                ordemCadastro.setTipoOrdem("I");
                ordemCadastro.setUsuarioCriacao("usuario.teste");
                ordemCadastro.setCodigoRota(0);
                ordemCadastro.setHoraPrevistaSaida("0000");

                OrdemDAO dao = new OrdemDAO();
                dao.incluirNovaOrdem(ordemCadastro, false);
                FacesUtil.adicionarMsgInfo("Ordem " + numeroOrdem + " criada com sucesso.");

                limpar();

                return true;
            }
        } catch (SQLException e) {
            Logger.getLogger(CadastroOrdemIndividualBean.class.getName()).log(Level.SEVERE, null, e);
            FacesUtil.adicionarMsgErro("Ocorreu um erro ao tentar salvar ordem: " + e.getMessage());
        }
        return false;
    }

    public void carregaMotoristas() {
        try {
            MotoristaDAO dao = new MotoristaDAO();
            todosMotoristas = dao.carregaTodosMotoristas();
            RequestContext context = RequestContext.getCurrentInstance();
            context.execute("PF('dlg').show();");

        } catch (SQLException ex) {
            Logger.getLogger(CadastroOrdemIndividualBean.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void carregaAreas() {
        try {
            AreaDAO dao = new AreaDAO();
            todasAreas = dao.carregaTodasAreas();
            RequestContext context = RequestContext.getCurrentInstance();
            context.execute("PF('dlgArea').show();");

        } catch (SQLException ex) {
            Logger.getLogger(CadastroOrdemIndividualBean.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void carregaVeiculos() {
        try {
            CarroDAO dao = new CarroDAO();
            todosVeiculos = dao.carregaTodosCarros();
            RequestContext context = RequestContext.getCurrentInstance();
            context.execute("PF('dlgCarro').show();");

        } catch (SQLException ex) {
            Logger.getLogger(CadastroOrdemIndividualBean.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void selecionaMotorista(SelectEvent event) {

        codigoMotorista = ((Motorista) event.getObject()).getCodigo();
        RequestContext context = RequestContext.getCurrentInstance();
        context.execute("PF('dlg').hide();");
        try {
            MotoristaDAO dao = new MotoristaDAO();
            motoristaSelecionado.setNome("");
            motoristaSelecionado = dao.pesquisaMotoristaPorCodigo(codigoMotorista);
        } catch (Exception e) {
            Logger.getLogger(CadastroOrdemIndividualBean.class.getName()).log(Level.SEVERE, null, e);
        }
    }

    public void selecionaArea(SelectEvent event) {

        codigoArea = ((Area) event.getObject()).getCodigo();
        RequestContext context = RequestContext.getCurrentInstance();
        context.execute("PF('dlgArea').hide();");
        try {
            AreaDAO dao = new AreaDAO();
            areaSelecionada = dao.buscaAreaPorCodigo(codigoArea);
        } catch (Exception e) {
            Logger.getLogger(CadastroOrdemIndividualBean.class.getName()).log(Level.SEVERE, null, e);
        }
    }

    public void selecionaCarro(SelectEvent event) {

        codigoCarro = ((Carro) event.getObject()).getCodigo();
        RequestContext context = RequestContext.getCurrentInstance();
        context.execute("PF('dlgCarro').hide();");
        try {
            CarroDAO dao = new CarroDAO();
            carroSelecionado = new Carro();
            carroSelecionado = dao.pesquisaCarroPorCodigo(codigoCarro);
            placaCarro = carroSelecionado.getPlaca();
            descricaoCarro = carroSelecionado.getDescricaoModelo();

            kmAnterior = dao.getKmCorrente(codigoCarro);

        } catch (Exception e) {
            Logger.getLogger(CadastroOrdemIndividualBean.class.getName()).log(Level.SEVERE, null, e);
        }
    }

    public boolean validaCampos() {

        MotoristaDAO motDao = new MotoristaDAO();
        AreaDAO areDao = new AreaDAO();
        CarroDAO carDao = new CarroDAO();
        try {
            Motorista motoristaTemp = motDao.pesquisaMotoristaPorCodigo(codigoMotorista);
            if (motoristaSelecionado != null) {
                if (!motoristaTemp.equals(motoristaSelecionado)) {
                    FacesUtil.adicionarMsgErro("Código de motorista inválido, verifique.");
                    return false;
                }
            } else {
                FacesUtil.adicionarMsgErro("Código de motorista inválido, verifique.");
                return false;
            }

            if (areaSelecionada != null) {
                Area areaTemp = areDao.buscaAreaPorCodigo(codigoArea);
                if (!areaTemp.equals(areaSelecionada)) {
                    FacesUtil.adicionarMsgErro("Código da área inválido, verifique.");
                    return false;
                }
            } else {
                FacesUtil.adicionarMsgErro("Código da área inválido, verifique.");
                return false;
            }

            if (carroSelecionado != null) {
                Carro carroTemp = carDao.pesquisaCarroPorCodigo(codigoCarro);
                if (!carroTemp.equals(carroSelecionado)) {
                    FacesUtil.adicionarMsgErro("Código do veículo inválido, verifique.");
                    return false;
                }
            } else {
                FacesUtil.adicionarMsgErro("Código do véiculo inválido, verifique.");
                return false;
            }

//            if (finalidade == null || finalidade.equals("")) {
//                FacesUtil.adicionarMsgErro("Informe a finalidade.");
//                return false;
//            }
//
//            if (destino == null || destino.equals("") || destino.trim().isEmpty()) {
//                FacesUtil.adicionarMsgErro("Informe o destino.");
//                return false;
//            }
//
//            if (nomeTransportadora == null || nomeTransportadora.equals("") || nomeTransportadora.trim().isEmpty()) {
//                FacesUtil.adicionarMsgErro("Informe a transportadora.");
//                return false;
//            }
//
//            if (dataReferencia == null) {
//                FacesUtil.adicionarMsgErro("Informe a data de referência.");
//                return false;
//            }
        } catch (SQLException e) {
            Logger.getLogger(CadastroOrdemIndividualBean.class.getName()).log(Level.SEVERE, null, e);
        }

        return true;
    }

    /**
     * ***
     * *******************
     * GETTERS E SETTERS * ******************* **
     *
     * @return
     */
    public Ordem getOrdemCadastro() {
        return ordemCadastro;
    }

    public void setOrdemCadastro(Ordem ordemCadastro) {
        this.ordemCadastro = ordemCadastro;
    }

    public Date getDataAtual() {
        return dataAtual;
    }

    public void setDataAtual(Date dataAtual) {
        this.dataAtual = dataAtual;
    }

    public List<Motorista> getTodosMotoristas() {
        return todosMotoristas;
    }

    public void setTodosMotoristas(List<Motorista> todosMotoristas) {
        this.todosMotoristas = todosMotoristas;
    }

    public List<Motorista> getFilteredMotors() {
        return filteredMotors;
    }

    public void setFilteredMotors(List<Motorista> filteredMotors) {
        this.filteredMotors = filteredMotors;
    }

    public Motorista getMotoristaSelecionado() {
        return motoristaSelecionado;
    }

    public void setMotoristaSelecionado(Motorista motoristaSelecionado) {
        this.motoristaSelecionado = motoristaSelecionado;
    }

    public Long getCodigoMotorista() {
        return codigoMotorista;
    }

    public void setCodigoMotorista(Long codigoMotorista) {
        this.codigoMotorista = codigoMotorista;
    }

    public List<Area> getTodasAreas() {
        return todasAreas;
    }

    public void setTodasAreas(List<Area> todasAreas) {
        this.todasAreas = todasAreas;
    }

    public List<Area> getFilteredArea() {
        return filteredArea;
    }

    public void setFilteredArea(List<Area> filteredArea) {
        this.filteredArea = filteredArea;
    }

    public Area getAreaSelecionada() {
        return areaSelecionada;
    }

    public void setAreaSelecionada(Area areaSelecionada) {
        this.areaSelecionada = areaSelecionada;
    }

    public Integer getCodigoArea() {
        return codigoArea;
    }

    public void setCodigoArea(Integer codigoArea) {
        this.codigoArea = codigoArea;
    }

    public Integer getCodigoCarro() {
        return codigoCarro;
    }

    public void setCodigoCarro(Integer codigoCarro) {
        this.codigoCarro = codigoCarro;
    }

    public List<Carro> getTodosVeiculos() {
        return todosVeiculos;
    }

    public void setTodosVeiculos(List<Carro> todosVeiculos) {
        this.todosVeiculos = todosVeiculos;
    }

    public List<Carro> getFilteredVeiculo() {
        return filteredVeiculo;
    }

    public void setFilteredVeiculo(List<Carro> filteredVeiculo) {
        this.filteredVeiculo = filteredVeiculo;
    }

    public Carro getCarroSelecionado() {
        return carroSelecionado;
    }

    public void setCarroSelecionado(Carro carroSelecionado) {
        this.carroSelecionado = carroSelecionado;
    }

    public String getPlacaCarro() {
        return placaCarro;
    }

    public void setPlacaCarro(String placaCarro) {
        this.placaCarro = placaCarro;
    }

    public String getDescricaoCarro() {
        return descricaoCarro;
    }

    public void setDescricaoCarro(String descricaoCarro) {
        this.descricaoCarro = descricaoCarro;
    }

    public Long getKmAnterior() {
        return kmAnterior;
    }

    public void setKmAnterior(Long kmAnterior) {
        this.kmAnterior = kmAnterior;
    }

    public String getObservacao() {
        return observacao;
    }

    public void setObservacao(String observacao) {
        this.observacao = observacao;
    }

    public Long getNumeroOrdem() {
        return numeroOrdem;
    }

    public void setNumeroOrdem(Long numeroOrdem) {
        this.numeroOrdem = numeroOrdem;
    }

    public Date getDataReferencia() {
        return dataReferencia;
    }

    public void setDataReferencia(Date dataReferencia) {
        this.dataReferencia = dataReferencia;
    }

    public String getFinalidade() {
        return finalidade;
    }

    public void setFinalidade(String finalidade) {
        this.finalidade = finalidade;
    }

    public String getDestino() {
        return destino;
    }

    public void setDestino(String destino) {
        this.destino = destino;
    }

    public String getNomeTransportadora() {
        return nomeTransportadora;
    }

    public void setNomeTransportadora(String nomeTransportadora) {
        this.nomeTransportadora = nomeTransportadora;
    }

}
