
package de.ivu.elect.business.search.control;

import javax.ejb.Stateless;
import javax.inject.Inject;
import javax.persistence.NoResultException;
import javax.persistence.NonUniqueResultException;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import de.ivu.elect.business.search.boundary.AbstractBenutzerSuchparameterDAO;
import de.ivu.elect.business.search.boundary.BenutzerSuchparameterDAO;
import de.ivu.elect.business.search.entity.BenutzerSuchparameter;
import de.ivu.elect.business.wahl.boundary.WahlDAO;
import de.ivu.elect.business.wahl.boundary.WahlterminDAO;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahl.entity.Wahltermin;

@Stateless
public class DefaultBenutzerSuchparameterAnlegen {

  private static final Logger LOG = LoggerFactory.getLogger(DefaultBenutzerSuchparameterAnlegen.class);

  @Inject
  private transient WahlterminDAO wahlterminDAO;

  @Inject
  private transient WahlDAO wahlDAO;

  @Inject
  private transient BenutzerSuchparameterDAO benutzerSuchparameterDAO;

  @Inject
  private transient BenutzerSuchparameterCreate benutzerSuchparameterCreate;

  public DefaultBenutzerSuchparameterAnlegen() {
    super();
  }

  public void create(Wahltermin wahlterminNotAttched, Wahl wahlNotAttached, String benutzerkennung, String viewId, String name, String suchparameter) {
    Wahltermin wahltermin = wahlterminDAO.attach(wahlterminNotAttched);
    Wahl wahl = wahlDAO.attach(wahlNotAttached);

    BenutzerSuchparameter benutzerSuchparameter = new BenutzerSuchparameter();
    benutzerSuchparameter.setWahltermin(wahltermin);
    benutzerSuchparameter.setWahl(wahl);
    benutzerSuchparameter.setBenutzerkennung(benutzerkennung);
    benutzerSuchparameter.setViewId(viewId);
    benutzerSuchparameter.setName(name);
    benutzerSuchparameter.setSuchparameter(suchparameter);

    if (vorhanden(benutzerSuchparameter)) {
      LOG.warn("Parameter schon vorhanden: name=" + name + ", benutzerkennung=" + benutzerkennung);
    } else {
      benutzerSuchparameterCreate.save(benutzerSuchparameter);

      LOG.info("Parameter angelegt: name=" + name + ", benutzerkennung=" + benutzerkennung);
    }
  }

  private boolean vorhanden(BenutzerSuchparameter benutzerSuchparameter) {
    return vorhanden(benutzerSuchparameter, benutzerSuchparameterDAO);
  }

  public static boolean vorhanden(BenutzerSuchparameter benutzerSuchparameter, AbstractBenutzerSuchparameterDAO abstractBenutzerSuchparameterDAO) {
    try {
      Wahltermin wahltermin = benutzerSuchparameter.getWahltermin();
      Wahl wahl = benutzerSuchparameter.getWahl();

      String benutzerkennung = benutzerSuchparameter.getBenutzerkennung();
      String viewId = benutzerSuchparameter.getViewId();
      String name = benutzerSuchparameter.getName();

      if (wahl == null) {
        return !abstractBenutzerSuchparameterDAO.findByWahlterminBenutzerkennungViewIdName(wahltermin, benutzerkennung, viewId, name).isEmpty();
      }

      return !abstractBenutzerSuchparameterDAO.findByWahlterminWahlBenutzerkennungViewIdName(wahltermin, wahl, benutzerkennung, viewId, name).isEmpty();
    } catch (NoResultException expected) {
      return false;
    } catch (NonUniqueResultException expected) {
      return true;
    }
  }
}
