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

import javax.annotation.Nullable;
import javax.ejb.Stateless;
import javax.inject.Inject;

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

import de.ivu.elect.business.benutzerverwaltung.entity.Benutzer;
import de.ivu.elect.business.statistik.entity.StatistikLauf;
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.WahlOderWahlterminPK;
import de.ivu.elect.business.wahl.entity.WahlPK;
import de.ivu.elect.business.wahl.entity.Wahltermin;
import de.ivu.elect.business.wahl.entity.WahlterminPK;
import de.ivu.elect.jee.faces.Messages;

/**
 *  on 03.01.2017.
 */
@Stateless
public class StatistikLaufAsyncCreate {

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

  @Inject
  StatistikLaufCreate statistikLaufCreate;

  @Inject
  WahlterminDAO wahlterminDAO;

  @Inject
  WahlDAO wahlDAO;

  @Inject
  Messages messages;

  public StatistikLaufAsyncCreate() {
    super();
  }

  public void createLauf(WahlOderWahlterminPK wahlOderWahlterminPK) throws Exception {
    LOG.info("StatistikLaufAsyncCreate.handle " + "wahlOderWahlterminPK = [" + wahlOderWahlterminPK + "]");

    StatistikLauf statistikLauf = new StatistikLauf();
    statistikLauf.setAusloeser(Benutzer.SYSTEM.getBenutzerkennung());

    Wahltermin wahltermin = null;
    Wahl wahl = null;

    if (wahlOderWahlterminPK.getWahlterminPK() != null) {
      wahltermin = findeWahltermin(wahlOderWahlterminPK.getWahlterminPK());
      if (wahltermin == null) {
        LOG.warn("Wahltermin nicht mehr vorhanden: " + wahlOderWahlterminPK);
        return;
      }
    }

    if (wahlOderWahlterminPK.getWahlPK() != null) {
      wahl = findeWahl(wahlOderWahlterminPK.getWahlPK());

      if (wahl == null) {
        LOG.warn("Wahl nicht mehr vorhanden: " + wahlOderWahlterminPK);
        return;
      }

      wahltermin = wahl.getWahltermin();
    }

    statistikLauf.setWahltermin(wahltermin);
    statistikLauf.setWahl(wahl);
    statistikLauf.setBeschreibung(messages.getMessageForMessageKey("statistik.lauf.beschreibung.cron.timer"));

    statistikLaufCreate.save(statistikLauf);

    LOG.info("StatistikLaufAsyncCreate.handle " + "wahlOderWahlterminPK = [" + wahlOderWahlterminPK + "]" + " - done");
  }

  @Nullable
  protected Wahl findeWahl(WahlPK wahlPK) {
    Wahl wahl;

    try {
      wahl = wahlDAO.findByPrimaryKey(wahlPK);
      wahl.getName(); // test, ob vorhanden
    } catch (Exception e) {
      wahl = null;
    }

    return wahl;
  }

  @Nullable
  protected Wahltermin findeWahltermin(WahlterminPK wahlterminPK) {
    Wahltermin wahltermin;

    try {
      wahltermin = wahlterminDAO.findByPrimaryKey(wahlterminPK);
      wahltermin.getName(); // test, ob vorhanden
    } catch (Exception e) {
      wahltermin = null;
    }

    return wahltermin;
  }

}
