
package de.ivu.elect.dokumente.wahlvorschlag;

import java.util.List;

import javax.inject.Inject;

import de.ivu.elect.business.dokumente.control.DokumentExtraFileOutput;
import de.ivu.elect.business.dokumente.entity.DokumentVorlageArt;
import de.ivu.elect.business.stimmzettel.boundary.EntityAufStimmzettelDatenDAOFactory;
import de.ivu.elect.business.wahlvorschlag.boundary.WahlvorschlagEmpfangsquittungDokumentContext;
import de.ivu.elect.business.wahlvorschlag.boundary.WahlvorschlagsdokumentDAO;
import de.ivu.elect.business.wahlvorschlag.control.WahlvorschlagEmpfangsquittungDokumentKonverter;
import de.ivu.elect.business.wahlvorschlag.entity.AbstractWahlvorschlagsdokument;
import de.ivu.elect.business.wahlvorschlag.entity.Wahlvorschlag;
import de.ivu.elect.business.wahlvorschlag.entity.Wahlvorschlagsdokument;
import de.ivu.elect.dokumente.CoreElectContext;
import de.ivu.elect.dokumente.CoreElectContextBuilder;
import de.ivu.elect.dokumente.kandidatur.KandidaturCoreDaten;
import de.ivu.elect.dokumente.konverter.AbstractListDokumentKonverter;

public class DefaultWahlvorschlagEmpfangsquittungDokumentKonverter extends AbstractListDokumentKonverter<Wahlvorschlag, WahlvorschlagEmpfangsquittungDokumentContext>
    implements
      WahlvorschlagEmpfangsquittungDokumentKonverter {

  @Inject
  private transient WahlvorschlagsdokumentDAO wahlvorschlagsdokumentDAO;

  @Inject
  private transient EntityAufStimmzettelDatenDAOFactory entityAufStimmzettelDatenDAOFactory;

  @Inject
  private transient CoreElectContextBuilder coreElectContextBuilder;

  public DefaultWahlvorschlagEmpfangsquittungDokumentKonverter() {
    super();
  }

  @Override
  public DokumentVorlageArt getDokumentVorlageArt() {
    return DokumentVorlageArt.WAHLVORSCHLAG_EMPFANGSQUITTUNG;
  }

  @Override
  protected Object konvertiere(Wahlvorschlag wahlvorschlag, WahlvorschlagEmpfangsquittungDokumentContext context, DokumentExtraFileOutput dokumentExtraFileOutput) {
    CoreElectContext coreElectContext = coreElectContextBuilder.create(createBaseElectContext(context, dokumentExtraFileOutput));

    return konvertiere(coreElectContext, wahlvorschlag, getWahlvorschlagsdokumente(wahlvorschlag),
        new KandidaturCoreDaten(coreElectContext, entityAufStimmzettelDatenDAOFactory.getEntityAufStimmzettelDaten()), context);
  }

  protected Object konvertiere(CoreElectContext coreElectContext, Wahlvorschlag wahlvorschlag, List<Wahlvorschlagsdokument> wahlvorschlagsdokumente, KandidaturCoreDaten kandidaturCoreDaten,
      WahlvorschlagEmpfangsquittungDokumentContext context) {
    return new WahlvorschlagEmpfangsquittungDocument(coreElectContext, wahlvorschlag, wahlvorschlagsdokumente, kandidaturCoreDaten, context.getEmpfaenger(), context.getZustellart());
  }

  private List<Wahlvorschlagsdokument> getWahlvorschlagsdokumente(Wahlvorschlag wahlvorschlag) {
    return AbstractWahlvorschlagsdokument.filterWahlvorschlagsdokumenteEditable(getWahlParameterLoader(), wahlvorschlag.getWahl(), wahlvorschlag,
        wahlvorschlagsdokumentDAO.findByWahlvorschlag(wahlvorschlag));
  }
}
