/**
   * [UC0393] Atualizar Agência Bancária
   *
   * <p>Este caso de uso permite alterar um valor de Agência Bancária
   *
   * @author Thiago Tenório
   * @date 31/10/2006
   * @param actionMapping
   * @param actionForm
   * @param httpServletRequest
   * @param httpServletResponse
   * @return
   */
  public ActionForward execute(
      ActionMapping actionMapping,
      ActionForm actionForm,
      HttpServletRequest httpServletRequest,
      HttpServletResponse httpServletResponse) {

    // Seta o mapeamento de retorno
    ActionForward retorno = actionMapping.findForward("atualizarAgenciaBancaria");

    HttpSession sessao = httpServletRequest.getSession(false);

    AtualizarAgenciaBancariaActionForm atualizarAgenciaBancariaActionForm =
        (AtualizarAgenciaBancariaActionForm) actionForm;

    String removerEndereco = (String) httpServletRequest.getParameter("removerEndereco");

    if (httpServletRequest.getParameter("menu") != null) {
      atualizarAgenciaBancariaActionForm.setBancoID("");
    }
    Fachada fachada = Fachada.getInstancia();

    // this.getAtendimentoMotivoEncerramentoCollection(sessao);
    //
    // this.getServicoTipoReferenciaCollection(sessao, fachada);

    String id = null;

    String idAgencia = null;

    if (httpServletRequest.getParameter("idRegistroAtualizacao") != null
        && !httpServletRequest.getParameter("idRegistroAtualizacao").equals("")) {

      sessao.removeAttribute("agencia");
      sessao.removeAttribute("colecaoAgenciaTela");
    }

    // Verifica se veio do filtrar ou do manter

    if (httpServletRequest.getParameter("manter") != null) {
      sessao.setAttribute("manter", true);
    } else if (httpServletRequest.getParameter("filtrar") != null) {
      sessao.removeAttribute("manter");
    }

    FiltroBanco filtroBanco = new FiltroBanco();

    Collection colecaoBancos = fachada.pesquisar(filtroBanco, Banco.class.getName());

    sessao.setAttribute("colecaoBanco", colecaoBancos);

    // Verifica se o servicoCobrancaValor já está na sessão, em caso
    // afirmativo
    // significa que o usuário já entrou na tela e apenas selecionou algum
    // item que deu um reload na tela e em caso negativo significa que ele
    // está entrando pela primeira vez
    if (sessao.getAttribute("agenciaAtualizar") == null) {

      // Limpa o endereço da sessão
      if (sessao.getAttribute("colecaoEnderecos") != null) {
        sessao.removeAttribute("colecaoEnderecos");
      }

      Agencia agencia = null;

      if (sessao.getAttribute("agencia") != null) {

        agencia = (Agencia) sessao.getAttribute("agencia");

        sessao.setAttribute("idAgencia", agencia.getId().toString());

        sessao.setAttribute("filtrar", true);

      } else {

        agencia = null;

        if (httpServletRequest.getParameter("inserir") != null) {
          sessao.setAttribute("inserir", true);
          sessao.setAttribute("filtrar", true);
        } else {
          sessao.removeAttribute("filtrar");
          sessao.removeAttribute("inserir");
        }

        idAgencia = null;

        if (httpServletRequest.getParameter("idRegistroAtualizacao") == null
            || httpServletRequest.getParameter("idRegistroAtualizacao").equals("")) {
          agencia = (Agencia) sessao.getAttribute("agencia");
        } else {
          idAgencia = (String) httpServletRequest.getParameter("idRegistroAtualizacao");
          sessao.setAttribute("idRegistroAtualizacao", idAgencia);
        }

        if (idAgencia != null) {

          id = idAgencia;

          FiltroAgencia filtroAgencia = new FiltroAgencia();
          filtroAgencia.adicionarCaminhoParaCarregamentoEntidade("banco");
          filtroAgencia.adicionarCaminhoParaCarregamentoEntidade("enderecoReferencia");
          filtroAgencia.adicionarCaminhoParaCarregamentoEntidade("cep");
          filtroAgencia.adicionarCaminhoParaCarregamentoEntidade(
              "logradouroCep.logradouro.logradouroTipo");
          filtroAgencia.adicionarCaminhoParaCarregamentoEntidade(
              "logradouroCep.logradouro.logradouroTitulo");
          filtroAgencia.adicionarCaminhoParaCarregamentoEntidade(
              "logradouroBairro.bairro.municipio.unidadeFederacao");
          filtroAgencia.adicionarCaminhoParaCarregamentoEntidade("logradouroCep.cep");

          filtroAgencia.adicionarParametro(new ParametroSimples(FiltroAgencia.ID, idAgencia));

          Collection<Agencia> colecaoAgencia =
              fachada.pesquisar(filtroAgencia, Agencia.class.getName());

          if (colecaoAgencia == null || colecaoAgencia.isEmpty()) {
            throw new ActionServletException("atencao.atualizacao.timestamp");
          }

          httpServletRequest.setAttribute("colecaoAgencia", colecaoAgencia);

          agencia = (Agencia) colecaoAgencia.iterator().next();
        }

        if (idAgencia == null) {
          if (sessao.getAttribute("idRegistroAtualizacao") != null) {
            idAgencia = (String) sessao.getAttribute("idRegistroAtualizacao");
          } else {
            agencia = (Agencia) sessao.getAttribute("osReferidaRetornoTipo");
            idAgencia = agencia.getId().toString();
          }
        }

        sessao.setAttribute("agenciaAtualizar", agencia);
      }

      if (agencia != null) {
        atualizarAgenciaBancariaActionForm.setCodigo(agencia.getCodigoAgencia().toString());

        atualizarAgenciaBancariaActionForm.setNome(agencia.getNomeAgencia());

        atualizarAgenciaBancariaActionForm.setTelefone(agencia.getNumeroTelefone());

        atualizarAgenciaBancariaActionForm.setRamal(agencia.getNumeroRamal());

        atualizarAgenciaBancariaActionForm.setFax(agencia.getNumeroFax());

        atualizarAgenciaBancariaActionForm.setEmail(agencia.getEmail());

        atualizarAgenciaBancariaActionForm.setBancoID(agencia.getBanco().getId().toString());

        Collection colecaoEnderecos = null;

        if (agencia.getEnderecoFormatado() != null) {
          colecaoEnderecos = new ArrayList();
          colecaoEnderecos.add(agencia);
          sessao.setAttribute("colecaoEnderecos", colecaoEnderecos);
        }

        id = agencia.getId().toString();

        sessao.setAttribute("agenciaAtualizar", agencia);
      }
    }

    // -------------- bt DESFAZER ---------------

    if (httpServletRequest.getParameter("desfazer") != null
        && httpServletRequest.getParameter("desfazer").equalsIgnoreCase("S")) {

      sessao.removeAttribute("colecaoAgenciaTela");

      String agenciaID = null;

      if (sessao.getAttribute("idRegistroAtualizacao") != null
          && !sessao.getAttribute("idRegistroAtualizacao").equals("")) {
        agenciaID = (String) sessao.getAttribute("idRegistroAtualizacao");
      }

      if ((agenciaID == null) && (id == null)) {

        Agencia agencia = (Agencia) sessao.getAttribute("agencia");

        atualizarAgenciaBancariaActionForm.setNome(agencia.getNomeAgencia());

        atualizarAgenciaBancariaActionForm.setTelefone(agencia.getNumeroTelefone());

        atualizarAgenciaBancariaActionForm.setRamal(agencia.getNumeroRamal());

        atualizarAgenciaBancariaActionForm.setFax(agencia.getNumeroFax());

        atualizarAgenciaBancariaActionForm.setEmail(agencia.getEmail());

        atualizarAgenciaBancariaActionForm.setBancoID(agencia.getBanco().getId().toString());

        Collection colecaoEnderecos = null;

        if (agencia.getEnderecoFormatado() != null) {
          colecaoEnderecos = new ArrayList();
          colecaoEnderecos.add(agencia);
          sessao.setAttribute("colecaoEnderecos", colecaoEnderecos);
        }

        sessao.setAttribute("agenciaAtualizar", agencia);
      }

      if ((idAgencia == null) && (id != null)) {

        idAgencia = id;
      }

      if (idAgencia != null) {

        FiltroAgencia filtroAgencia = new FiltroAgencia();
        filtroAgencia.adicionarCaminhoParaCarregamentoEntidade("banco");

        filtroAgencia.adicionarParametro(new ParametroSimples(FiltroAgencia.ID, idAgencia));

        Collection<Agencia> colecaoAgencia =
            fachada.pesquisar(filtroAgencia, Agencia.class.getName());

        if (colecaoAgencia == null || colecaoAgencia.isEmpty()) {
          throw new ActionServletException("atencao.atualizacao.timestamp");
        }

        httpServletRequest.setAttribute("colecaoAgencia", colecaoAgencia);

        Agencia agencia = (Agencia) colecaoAgencia.iterator().next();

        atualizarAgenciaBancariaActionForm.setCodigo(agencia.getCodigoAgencia().toString());

        atualizarAgenciaBancariaActionForm.setNome(agencia.getNomeAgencia());

        atualizarAgenciaBancariaActionForm.setTelefone(agencia.getNumeroTelefone());

        atualizarAgenciaBancariaActionForm.setRamal(agencia.getNumeroRamal());

        atualizarAgenciaBancariaActionForm.setFax(agencia.getNumeroFax());

        atualizarAgenciaBancariaActionForm.setEmail(agencia.getEmail());

        atualizarAgenciaBancariaActionForm.setBancoID(agencia.getBanco().getId().toString());

        httpServletRequest.setAttribute("idAgencia", idAgencia);
        sessao.setAttribute("agenciaAtualizar", agencia);
      }
    }
    // -------------- bt DESFAZER ---------------

    httpServletRequest.setAttribute(
        "colecaoAgenciaTela", sessao.getAttribute("colecaoAgenciaTipoValorTela"));

    sessao.removeAttribute("tipoPesquisaRetorno");

    // Remove o endereco informado.
    if (removerEndereco != null && !removerEndereco.trim().equalsIgnoreCase("")) {

      if (sessao.getAttribute("colecaoEnderecos") != null) {

        Collection enderecos = (Collection) sessao.getAttribute("colecaoEnderecos");
        if (!enderecos.isEmpty()) {
          enderecos.remove(enderecos.iterator().next());
        }
      }
    }

    return retorno;
  }