
package de.ivu.elect.core.exchange.stimmen.csv.dynamic;

import java.io.OutputStream;

import javax.inject.Inject;

import de.ivu.elect.business.datei.entity.FileType;
import de.ivu.elect.business.ergebnis.control.ErgebnisDaten;
import de.ivu.elect.business.ergebnis.control.ErgebnisExportContext;
import de.ivu.elect.business.ergebnis.control.ErgebnisExportObject;
import de.ivu.elect.business.exchange.control.FileKonfiguration;
import de.ivu.elect.business.exchange.control.MappingException;
import de.ivu.elect.business.gebietsbaum.boundary.GebietDAO;
import de.ivu.elect.business.gebietsbaum.boundary.WahlverwaltungGebietInformationResolver;
import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.business.stimmeingabe.control.ListenwahlStimmeingabeKonfiguration;
import de.ivu.elect.business.wahl.entity.Wahl;

public abstract class AbstractDynamicStimmenCsvExportMapper<F extends AbstractDynamicStimmenExportDTOFactory> extends AbstractDynamicStimmenExportMapper<F> {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient GebietDAO gebietDAO;

  @Inject
  private transient WahlverwaltungGebietInformationResolver wahlverwaltungGebietInformationResolver;

  protected AbstractDynamicStimmenCsvExportMapper() {
    super();
  }

  @Override
  protected FileType getFileType() {
    return FileType.CSV;
  }

  @Override
  protected F createDtoFactory(ErgebnisDaten ergebnisDaten, Wahldurchfuehrungsgebiet wurzelgebiet, ErgebnisExportContext context,
      ListenwahlStimmeingabeKonfiguration listenwahlStimmeingabeKonfiguration) {
    return createDtoFactory(ergebnisDaten, wurzelgebiet, context, getWahlverwaltungGebietInformationResolver(), listenwahlStimmeingabeKonfiguration);
  }

  protected abstract F createDtoFactory(ErgebnisDaten ergebnisDaten, Wahldurchfuehrungsgebiet wurzelgebiet, ErgebnisExportContext context,
      WahlverwaltungGebietInformationResolver wahlverwaltungGebietInformationResolver, ListenwahlStimmeingabeKonfiguration listenwahlStimmeingabeKonfiguration);

  @Override
  public void serialize(ErgebnisExportObject exportObject, OutputStream os, ErgebnisExportContext context, FileKonfiguration fileKonfiguration) throws MappingException {
    ErgebnisDaten ergebnisDaten = exportObject.getErgebnisDaten();
    Wahldurchfuehrungsgebiet wurzelgebiet = ergebnisDaten.getWurzelgebiet(); /* erstmal das oberste Gebiet, eigentlich Stimmzettelgebiet...vgl AbstractKomStimmenZipExportMapper */

    writeDatenFuerWurzelgebiet(os, ergebnisDaten, wurzelgebiet, context);
  }

  protected boolean isWahlMitMehrerenWahlgebieten(Wahl wahl) {
    return wahl != null && gebietDAO.findByWahlAndWahlgebiet(wahl, true).size() > 1;
  }

  protected WahlverwaltungGebietInformationResolver getWahlverwaltungGebietInformationResolver() {
    return wahlverwaltungGebietInformationResolver;
  }
}
