package controller;

import entities.Antwort;
import entities.Forum;
import java.io.Serializable;
import java.util.List;
import javax.annotation.Resource;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceUnit;
import javax.transaction.UserTransaction;

@ManagedBean
@SessionScoped
public class Controller implements Serializable {

  @PersistenceUnit
  private EntityManagerFactory emf;
  @Resource
  private UserTransaction utx;
  private EntityManager em;
  private List<Forum> foren;
  private String eingabe;
  private Forum forum = new Forum();

  public List<Forum> getForen() {
    // if (foren == null) {
    em = emf.createEntityManager();
    foren = em.createQuery("SELECT f FROM Forum f", Forum.class).getResultList();
    schliessen();
    // }
    return foren;
  }

  public Forum getForum() {
    return forum;
  }

  public String hinzufuegen() {
    FacesContext ctxt = FacesContext.getCurrentInstance();
    FacesMessage ms = new FacesMessage("Erfolgreich eingetragen");

    try {
      utx.begin();
      em = emf.createEntityManager();
      em.persist(forum.clone());
      forum.setFrage("");
      foren = em.createQuery("SELECT f FROM Forum f", Forum.class).getResultList();
      System.out.println(foren);
      utx.commit();
    } catch (Exception e) {
      try {
        ms = new FacesMessage(e.getMessage());
        utx.rollback();
      } catch (Exception e2) {
        ms = new FacesMessage(e2.getMessage());
      }
    } finally {
      schliessen();
    }
    ctxt.addMessage(null, ms);
    //f.setFrage("");
    return "./index.xhtml";
  }

  public String editieren(Forum f) {
    System.out.println("forum:" + forum + "\nf:" + f);
    forum = f;
    return "./beitrag/diskutieren.xhtml?faces-redirect=true";
  }

  private void schliessen() {
    if (em != null && em.isOpen()) {
      em.close();
    }
  }

  public String getEingabe() {
    return eingabe;
  }

  public void setEingabe(String eingabe) {
    this.eingabe = eingabe;
  }

  public String antworten() {
    System.out.println("Forum: " + forum);
    FacesContext ctxt = FacesContext.getCurrentInstance();
    FacesMessage ms = new FacesMessage("Erfolgreich eingetragen");

    try {
      utx.begin();
      em = emf.createEntityManager();
      Antwort a = new Antwort(eingabe);
      em.persist(a);
      Forum f = em.find(Forum.class, forum.getId());
      eingabe = "";
      //forum.antwortHinzufuegen(a);
      //em.merge(forum);
      //em.flush();
      //forum.setAntworten(em.createQuery("SELECT a FROM Forum f JOIN f.antworten a WHERE f.id="+forum.getId(), Antwort.class).getResultList());
      f.antwortHinzufuegen(a);
      em.persist(f);
      forum = f;
      utx.commit();

    } catch (Exception e) {
      try {
        ms = new FacesMessage(e.getMessage());
        utx.rollback();
      } catch (Exception e2) {
        ms = new FacesMessage(e2.getMessage());
      }
    } finally {
      schliessen();
    }
    ctxt.addMessage(null, ms);
    return "./diskutieren.xhtml?faces-redirect=true";
  }

  public String abmelden() {
    ExternalContext ectx = FacesContext.getCurrentInstance().getExternalContext();
    ectx.invalidateSession();
    return "//index.xhtml?faces-redirect=true";
  }

  public String start() {
    return abmelden();
  }
}
