/** pesquisa no banco de Dados por um carro de acordo com a placa */
  public void pesquisarPorPlaca() {

    setEhCadastrado(false);
    setJaPesquisei(true);

    // Retorna um estado completo de acordo com um ID
    ICommand command = mapCommands.get("CONSULTAR");
    Resultado resultado = new Resultado();
    resultado = command.execute(revisao.getCarro());

    // CArro foi encontrado
    if (resultado.getEntidades().get(0) != null) {
      revisao.setCarro((Carro) resultado.getEntidades().get(0));
      setEhCadastrado(true);
      setJaPesquisei(false);
      return;
    } else {
      revisao.setCarro(new Carro());
      return;
    }
  }
  @Override
  public void carregarListagem() {

    // escolhe o Command corretamente de acordo com a operacao
    ICommand command = mapConducaoCommands.get("LISTAR");
    Resultado resultado = new Resultado();

    resultado = command.execute(new Revisao());
    if (resultado != null) {
      listaRevisao = resultado.getEntidades();
    }
    totaoRevisaoRealizada = listaRevisao.size();

    command = mapConducaoCommands.get("CONSULTAR");
    resultado = new Resultado();

    resultado = command.execute(new Devolucao());
    if (resultado != null) {
      listaDevolucaoAguardandoRevisao = resultado.getEntidades();
    }

    totalRevisaoNaFila = listaDevolucaoAguardandoRevisao.size();

    // se nao for vazio limpa para nao ocorrer duplicação
    if (!produtosCadastrados.isEmpty()) {
      produtosCadastrados.clear();
    }

    carregarProdutosCadastrados();

    /*
     * verifica se ja ja tem uma Devolução preenchida Se tiver significa que
     * foi clicado para Revisar na View Devolucao.xhtml
     */
    if (revisao.getDevolucao().getId() > 0) {
      revisao.setCarro(revisao.getDevolucao().getRetirada().getCarro());
      revisao.setQuilometragem(Long.valueOf(revisao.getDevolucao().getQuilometragem()));
      pesquisarPorPlaca();
    }
  }
  /** limpa a tela de pesquisa de REvisao Deixando pronto para uma nova Pesquisa */
  public void limparObjetos() {

    revisao = new Revisao();
    revisao.setCarro(new Carro());

    arrefecimento = new Arrefecimento();
    bateria = new Bateria();
    embreagem = new Embreagem();
    freio = new Freio();
    motor = new Motor();
    suspensao = new Suspensao();
    dianteiroDireito = new Pneu();
    dianteiroEsquerdo = new Pneu();
    traseiroDireito = new Pneu();
    traseiroEsquerdo = new Pneu();
    estepe = new Pneu();

    // limpar Produtos

    amortecedorProduto = new Amortecedor();
    correiaDentadaProduto = new CorreiaDentada();
    embreagemProduto = new br.com.dealercar.domain.produtosrevisao.Embreagem();
    farolProduto = new Farol();
    filtroDeArProduto = new FiltroDeAr();
    filtroDeOleoMotorProduto = new FiltroDeOleoMotor();
    fluidoDeFreioProduto = new FluidoDeFreio();
    pastilhaFreioProduto = new PastilhaFreio();
    pneuProduto = new br.com.dealercar.domain.produtosrevisao.Pneu();
    velasIgnicaoProduto = new VelasIgnicao();

    pneus.clear();

    produtosCadastrados.clear();
    produtosUtilizados.clear();
    produtoRevisao = new ProdutoRevisao();

    quantidadeProduto.put(Amortecedor.class.getSimpleName(), 0);
    quantidadeProduto.put(CorreiaDentada.class.getSimpleName(), 0);
    quantidadeProduto.put(
        br.com.dealercar.domain.produtosrevisao.Embreagem.class.getSimpleName(), 0);
    quantidadeProduto.put(Farol.class.getSimpleName(), 0);
    quantidadeProduto.put(FiltroDeAr.class.getSimpleName(), 0);
    quantidadeProduto.put(FiltroDeOleoMotor.class.getSimpleName(), 0);
    quantidadeProduto.put(FluidoDeFreio.class.getSimpleName(), 0);
    quantidadeProduto.put(PastilhaFreio.class.getSimpleName(), 0);
    quantidadeProduto.put(br.com.dealercar.domain.produtosrevisao.Pneu.class.getSimpleName(), 0);
    quantidadeProduto.put(VelasIgnicao.class.getSimpleName(), 0);

    setEhCadastrado(false);
    setJaPesquisei(false);
  }
  /** Adiciona o produto utilizado na Revisão */
  public void addProduto() {

    // recebe a operacao a ser realizada
    String operacao =
        FacesContext.getCurrentInstance()
            .getExternalContext()
            .getRequestParameterMap()
            .get("param");
    ICommand command = mapCommands.get(operacao);

    if (revisao.getQuilometragem().equals("") || revisao.getQuilometragem() < 0) {
      org.primefaces.context.RequestContext.getCurrentInstance()
          .update(":frmNovaRevisaoTab:pnlNovaRevisao :msgGlobal");
    }

    produtoRevisao.setQuantidade(produtoRevisao.getQuantidade() - 1);
    quantidadeProduto.put(
        produtoRevisao.getClass().getSimpleName(),
        quantidadeProduto.get(produtoRevisao.getClass().getSimpleName()) + 1);

    if (produtoRevisao instanceof Amortecedor) {
      amortecedorProduto = (Amortecedor) produtoRevisao;

      command.execute((Amortecedor) produtoRevisao);
      amortecedorProduto.setQuantidade(quantidadeProduto.get(Amortecedor.class.getSimpleName()));
      // adicionanto a table de produtos utilizados
      produtosUtilizados.add(amortecedorProduto);

    } else if (produtoRevisao instanceof CorreiaDentada) {
      correiaDentadaProduto = (CorreiaDentada) produtoRevisao;

      command.execute((CorreiaDentada) produtoRevisao);
      correiaDentadaProduto.setQuantidade(
          quantidadeProduto.get(CorreiaDentada.class.getSimpleName()));
      produtosUtilizados.add(correiaDentadaProduto);

    } else if (produtoRevisao instanceof br.com.dealercar.domain.produtosrevisao.Embreagem) {
      embreagemProduto = (br.com.dealercar.domain.produtosrevisao.Embreagem) produtoRevisao;

      command.execute((br.com.dealercar.domain.produtosrevisao.Embreagem) produtoRevisao);
      embreagemProduto.setQuantidade(quantidadeProduto.get(Embreagem.class.getSimpleName()));
      produtosUtilizados.add(embreagemProduto);

    } else if (produtoRevisao instanceof Farol) {
      farolProduto = (Farol) produtoRevisao;

      command.execute((Farol) produtoRevisao);
      farolProduto.setQuantidade(quantidadeProduto.get(Farol.class.getSimpleName()));
      produtosUtilizados.add(farolProduto);

    } else if (produtoRevisao instanceof FiltroDeAr) {
      filtroDeArProduto = (FiltroDeAr) produtoRevisao;

      command.execute((FiltroDeAr) produtoRevisao);
      filtroDeArProduto.setQuantidade(quantidadeProduto.get(FiltroDeAr.class.getSimpleName()));
      produtosUtilizados.add(filtroDeArProduto);

    } else if (produtoRevisao instanceof FiltroDeOleoMotor) {
      filtroDeOleoMotorProduto = (FiltroDeOleoMotor) produtoRevisao;

      command.execute((FiltroDeOleoMotor) produtoRevisao);
      filtroDeOleoMotorProduto.setQuantidade(
          quantidadeProduto.get(FiltroDeOleoMotor.class.getSimpleName()));
      produtosUtilizados.add(filtroDeOleoMotorProduto);

    } else if (produtoRevisao instanceof FluidoDeFreio) {
      fluidoDeFreioProduto = (FluidoDeFreio) produtoRevisao;

      command.execute((FluidoDeFreio) produtoRevisao);
      fluidoDeFreioProduto.setQuantidade(
          quantidadeProduto.get(FluidoDeFreio.class.getSimpleName()));
      produtosUtilizados.add(fluidoDeFreioProduto);

    } else if (produtoRevisao instanceof PastilhaFreio) {
      pastilhaFreioProduto = (PastilhaFreio) produtoRevisao;

      command.execute((PastilhaFreio) produtoRevisao);
      pastilhaFreioProduto.setQuantidade(
          quantidadeProduto.get(PastilhaFreio.class.getSimpleName()));
      produtosUtilizados.add(pastilhaFreioProduto);

    } else if (produtoRevisao instanceof br.com.dealercar.domain.produtosrevisao.Pneu) {
      pneuProduto = (br.com.dealercar.domain.produtosrevisao.Pneu) produtoRevisao;

      command.execute((br.com.dealercar.domain.produtosrevisao.Pneu) produtoRevisao);
      pneuProduto.setQuantidade(
          quantidadeProduto.get(
              br.com.dealercar.domain.produtosrevisao.Pneu.class.getSimpleName()));
      produtosUtilizados.add(pneuProduto);

    } else if (produtoRevisao instanceof VelasIgnicao) {
      velasIgnicaoProduto = (VelasIgnicao) produtoRevisao;

      command.execute((VelasIgnicao) produtoRevisao);
      velasIgnicaoProduto.setQuantidade(quantidadeProduto.get(VelasIgnicao.class.getSimpleName()));
      produtosUtilizados.add(velasIgnicaoProduto);
    }

    produtoRevisao = new ProdutoRevisao();
  }
  /** Efetua a revisao do carro pesquisado */
  @Override
  public void executar() {

    // recebe a operacao a ser realizada
    String operacao =
        FacesContext.getCurrentInstance()
            .getExternalContext()
            .getRequestParameterMap()
            .get("param");

    // Retorna um estado completo de acordo com um ID
    ICommand command = mapConducaoCommands.get(operacao);

    // recebendo os componentes
    revisao.getComponentes().add(arrefecimento);
    revisao.getComponentes().add(bateria);
    revisao.getComponentes().add(embreagem);
    revisao.getComponentes().add(freio);
    revisao.getComponentes().add(lanterna);
    revisao.getComponentes().add(motor);
    revisao.getComponentes().add(suspensao);

    // recebendo os pneus
    dianteiroDireito.setPosicaoPneu(PosicaoPneu.DIANTEIRO_DIREITO);
    dianteiroEsquerdo.setPosicaoPneu(PosicaoPneu.DIANTEIRO_ESQUERDO);
    traseiroDireito.setPosicaoPneu(PosicaoPneu.TRASEIRO_DIREITO);
    traseiroEsquerdo.setPosicaoPneu(PosicaoPneu.TRASEIRO_ESQUERDO);
    estepe.setPosicaoPneu(PosicaoPneu.ESTEPE);
    pneus.add(dianteiroDireito);
    pneus.add(dianteiroEsquerdo);
    pneus.add(traseiroDireito);
    pneus.add(traseiroEsquerdo);
    pneus.add(estepe);

    // Adicionando cada pneu da lista Pneus na lista Componentes
    for (int j = 0; j < pneus.size(); j++) {
      revisao.getComponentes().add(pneus.get(j));
    }

    // pega a data atual do sistema
    revisao.setDataRevisao(DataUtil.pegarDataAtualDoSistema());

    // pega o funcionario que realizou a Revisão
    revisao.setFuncionario((Funcionario) SessionUtil.getParam("usuarioLogado"));

    if (revisao.getDevolucao().getId() > 0) {
      revisao.getDevolucao().setAguardaRevisao(false);
      command = mapConducaoCommands.get("EDITAR");
      command.execute(revisao.getDevolucao());
    }

    // armazena a lista de produtos utilizados na Revisao
    new ProdutoRevisaoDAO().cadastrar(verificarTotalUtilizado());
    revisao.setListaProdutoRevisao(new ProdutoRevisaoDAO().pesquisarPorUltimoCadastrado());

    command = mapConducaoCommands.get(operacao);
    command.execute(revisao);

    limparObjetos();
  }