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

import javax.inject.Inject;

import de.ivu.elect.business.unterstuetzer.boundary.EintragungslisteEintragDAO;
import de.ivu.elect.business.unterstuetzer.entity.Eintragungsliste;
import de.ivu.elect.business.unterstuetzer.entity.EintragungslisteEintrag;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahlvorschlag.boundary.WahlvorschlagDAO;
import de.ivu.elect.business.wahlvorschlag.entity.Wahlvorschlag;

public class EintragungslisteCreate extends AbstractEintragungslisteCreate {

  @Inject
  private transient WahlvorschlagDAO wahlvorschlagDAO;

  @Inject
  private transient EintragungslisteEintragDAO eintragungslisteEintragDAO;

  public EintragungslisteCreate() {
    super();
  }

  @Override
  public void save(Eintragungsliste eintragungsliste) {
    Wahlvorschlag wahlvorschlag = attach(eintragungsliste.getWahlvorschlag());

    if (wahlvorschlag == null) {
      throw new IllegalArgumentException("Eintragungsliste ohne Wahlvorschlag nicht unterstützt");
    }

    Long nummer = eintragungsliste.getNummer();

    if (nummer != null && !dao.findByWahlvorschlagAndNummer(wahlvorschlag, nummer).isEmpty()) { // ELECTMUC-3083
      throw new IllegalArgumentException("Eintragungsliste bereits vorhanden [wahlvorschlag = " + wahlvorschlag + ", nummer = " + nummer + "]");
    }

    eintragungsliste.setWahlvorschlag(wahlvorschlag);

    Wahl wahl = eintragungsliste.getWahl();

    if (wahl == null || !wahl.isWahlMitUnterstuetzerAufEintragungslisten()) {
      throw new IllegalArgumentException("Eintragungsliste für Wahl nicht unterstützt [wahl = " + wahl + "]");
    }

    super.save(eintragungsliste);

    long positionMin = eintragungsliste.getEintragungslisteEintraege().size() + 1L;
    long positionMax = eintragungsliste.getAnzahlEintragungslisteEintraegeErwartet();

    for (long position = positionMin; position <= positionMax; position++) {
      saveEintragungslisteEintrag(eintragungsliste, position);
    }
  }

  public void saveEintragungslisteEintrag(Eintragungsliste eintragungsliste, long eintragungslisteEintragPosition) {
    eintragungslisteEintragDAO.persist(createEintragungslisteEintrag(attach(eintragungsliste), eintragungslisteEintragPosition));
  }

  private EintragungslisteEintrag createEintragungslisteEintrag(Eintragungsliste eintragungsliste, long position) {
    EintragungslisteEintrag eintragungslisteEintrag = new EintragungslisteEintrag();
    eintragungslisteEintrag.initLeerzeile();
    eintragungslisteEintrag.setEintragungslisteOhneUpdateBeziehung(eintragungsliste);
    eintragungslisteEintrag.setPosition(position);

    return eintragungslisteEintrag;
  }

  private Wahlvorschlag attach(Wahlvorschlag wahlvorschlag) {
    return wahlvorschlagDAO.attach(wahlvorschlag);
  }

  private Eintragungsliste attach(Eintragungsliste eintragungsliste) {
    return dao.attach(eintragungsliste);
  }
}
