/**
  * Valida a edição da {@link Turma} e realiza a edição chamando as funções que lidam com o banco
  * de dados
  *
  * @param turma {@link Turma} que está sendo validada
  */
 @Command
 public void confirm(@BindingParam("turma") Turma turma) {
   if (turmaBusiness.validar(turma)) {
     if (!turmaBusiness.editar(turma))
       Messagebox.show(
           "Não foi possível editar o departamento.", "Erro", Messagebox.OK, Messagebox.ERROR);
     editTemp.remove(turma.getId());
     turma.setEditingStatus(false);
     refreshRowTemplate(turma);
   } else {
     String errorMessage = "";
     for (String error : turmaBusiness.getErrors()) errorMessage += error;
     Messagebox.show(
         errorMessage, "Dados insuficientes / inválidos", Messagebox.OK, Messagebox.ERROR);
   }
 }
 /**
  * /** Valida os dados da nova {@link Turma} e envia para ser salva no banco , se falhar mostra
  * uma mensagem de erro.
  *
  * @param window Janela que contém os campos de informação da {@link Turma}
  */
 @Command
 public void submitTurma(@BindingParam("window") final Window window) {
   if (turmaBusiness.validar(novaTurma)) {
     if (turmaBusiness.salvar(novaTurma)) {
       todasTurmas.add(novaTurma);
       filterTurmas = todasTurmas;
       notifyTurmas();
       Clients.clearBusy(window);
       Messagebox.show("Turma Adicionada!", "Sucesso", Messagebox.OK, Messagebox.INFORMATION);
       limpa();
     } else {
       Clients.clearBusy(window);
       Messagebox.show("A turma não foi adicionada!", "Erro", Messagebox.OK, Messagebox.ERROR);
     }
   } else {
     String errorMessage = "";
     for (String error : turmaBusiness.getErrors()) errorMessage += error;
     Messagebox.show(
         errorMessage, "Dados insuficientes / inválidos", Messagebox.OK, Messagebox.ERROR);
   }
 }
/**
 * Classe que controla a página gerencia_turmas.zul
 *
 * @author Eduardo Rocha Soares, Jorge Moreira da Silva
 */
public class AdminTurmasController {
  private TurmaBusiness turmaBusiness = new TurmaBusiness();
  private Turma novaTurma = new Turma();
  private Map<Integer, Turma> editTemp = new HashMap<Integer, Turma>();
  private List<Turma> todasTurmas = turmaBusiness.getTodas();
  private List<Turma> filterTurmas = todasTurmas;
  private String filterInt;

  public List<Turma> getFilterTurmas() {
    return filterTurmas;
  }

  public Turma getNovaTurma() {
    return this.novaTurma;
  }

  public void setNovaTurma(Turma novaTurma) {
    this.novaTurma = novaTurma;
  }

  public String getFilterInt() {
    return filterInt;
  }

  public void setFilterInt(String filterInt) {
    this.filterInt = filterInt;
  }
  /**
   * Habilita uma determinada {@link Turma} no template para edição.
   *
   * @param turma {@link Turma} que será habilitada para edição
   */
  @Command
  public void changeEditableStatus(@BindingParam("turma") Turma turma) {
    if (!turma.getEditingStatus()) {
      Turma temp = new Turma();
      temp.copy(turma);
      editTemp.put(turma.getId(), temp);
      turma.setEditingStatus(true);
    } else {
      turma.copy(editTemp.get(turma.getId()));
      editTemp.remove(turma.getId());
      turma.setEditingStatus(false);
    }
    refreshRowTemplate(turma);
  }

  /**
   * Valida a edição da {@link Turma} e realiza a edição chamando as funções que lidam com o banco
   * de dados
   *
   * @param turma {@link Turma} que está sendo validada
   */
  @Command
  public void confirm(@BindingParam("turma") Turma turma) {
    if (turmaBusiness.validar(turma)) {
      if (!turmaBusiness.editar(turma))
        Messagebox.show(
            "Não foi possível editar o departamento.", "Erro", Messagebox.OK, Messagebox.ERROR);
      editTemp.remove(turma.getId());
      turma.setEditingStatus(false);
      refreshRowTemplate(turma);
    } else {
      String errorMessage = "";
      for (String error : turmaBusiness.getErrors()) errorMessage += error;
      Messagebox.show(
          errorMessage, "Dados insuficientes / inválidos", Messagebox.OK, Messagebox.ERROR);
    }
  }
  /**
   * Deleta uma {@link Turma} do banco de dados
   *
   * @param turma {@link Turma} a ser deletada
   */
  @SuppressWarnings({"unchecked", "rawtypes"})
  @Command
  public void delete(@BindingParam("turma") final Turma turma) {
    Messagebox.show(
        "Você tem certeza que deseja excluir a turma do semestre " + turma.getSemestre() + "?",
        "Confirmação",
        Messagebox.OK | Messagebox.CANCEL,
        Messagebox.QUESTION,
        new org.zkoss.zk.ui.event.EventListener() {
          public void onEvent(Event e) {
            if (Messagebox.ON_OK.equals(e.getName())) {

              if (turmaBusiness.exclui(turma)) {
                removeFromList(turma);
                Messagebox.show(
                    "A turma foi excluida com sucesso.",
                    "Sucesso",
                    Messagebox.OK,
                    Messagebox.INFORMATION);
              } else {
                String errorMessage = "A turma não pode ser excluída.\n";
                for (String error : turmaBusiness.getErrors()) errorMessage += error;
                Messagebox.show(errorMessage, "Erro", Messagebox.OK, Messagebox.ERROR);
              }
            }
          }
        });
  }
  /**
   * Remove uma {@link Turma} da {@link List} de turmas e notifica o zk da mudança
   *
   * @param turma {@link Turma} a ser removida da {@link List}
   */
  public void removeFromList(Turma turma) {
    filterTurmas.remove(turma);
    todasTurmas.remove(turma);
    BindUtils.postNotifyChange(null, null, this, "filterTurmas");
  }
  /**
   * Notifica o ZK que uma {@link Turma} foi editada
   *
   * @param turma {@link Turma} que teve os dados atualizados
   */
  public void refreshRowTemplate(Turma turma) {
    BindUtils.postNotifyChange(null, null, turma, "editingStatus");
  }
  /**
   * Filtra as {@link Turma}s da {@link List} de acordo com uma string de busca e notifica o zk para
   * mostrar apenas as {@link Turma}s que atendem aquela busca
   */
  @Command
  public void filtra() {
    filterTurmas = new ArrayList<Turma>();
    for (Turma c : todasTurmas) {
      if (String.valueOf(c.getAno()).contains(filterInt)) {
        filterTurmas.add(c);
      }
    }
    BindUtils.postNotifyChange(null, null, this, "filterTurmas");
  }

  /**
   * Invoca a janela que conterá os dados para adicionar nova turma e limpa esses campos.
   *
   * @param window Janela que contem os campos de dados para adicionar nova {@link Turma}
   */
  @Command
  public void addTurma(@BindingParam("window") Window window) {
    this.limpa();
    window.doModal();
  }
  /**
   * /** Valida os dados da nova {@link Turma} e envia para ser salva no banco , se falhar mostra
   * uma mensagem de erro.
   *
   * @param window Janela que contém os campos de informação da {@link Turma}
   */
  @Command
  public void submitTurma(@BindingParam("window") final Window window) {
    if (turmaBusiness.validar(novaTurma)) {
      if (turmaBusiness.salvar(novaTurma)) {
        todasTurmas.add(novaTurma);
        filterTurmas = todasTurmas;
        notifyTurmas();
        Clients.clearBusy(window);
        Messagebox.show("Turma Adicionada!", "Sucesso", Messagebox.OK, Messagebox.INFORMATION);
        limpa();
      } else {
        Clients.clearBusy(window);
        Messagebox.show("A turma não foi adicionada!", "Erro", Messagebox.OK, Messagebox.ERROR);
      }
    } else {
      String errorMessage = "";
      for (String error : turmaBusiness.getErrors()) errorMessage += error;
      Messagebox.show(
          errorMessage, "Dados insuficientes / inválidos", Messagebox.OK, Messagebox.ERROR);
    }
  }
  /** Notifica o zk que houve uma mudança na {@link List} de {@link Turma} */
  public void notifyTurmas() {
    BindUtils.postNotifyChange(null, null, this, "filterTurmas");
  }
  /** Limpa as informações dos campos da janela de adicionar {@link Turma} */
  public void limpa() {
    novaTurma = new Turma();
    BindUtils.postNotifyChange(null, null, this, "novaTurma");
  }
}