
package de.ivu.elect.business.wahlvorschlag.boundary;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

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

import de.ivu.elect.business.exchange.control.AbstractExporter;
import de.ivu.elect.business.exchange.control.ExportExchange;
import de.ivu.elect.business.exchange.entity.DateiExportArt;
import de.ivu.elect.business.kandidatur.boundary.KandidaturDAO;
import de.ivu.elect.business.kandidatur.entity.Kandidatur;
import de.ivu.elect.business.person.entity.Personendaten;
import de.ivu.elect.business.wahl.boundary.WahlDAO;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahlausschuss.boundary.WahlausschussmitgliedDAO;
import de.ivu.elect.business.wahlausschuss.entity.Wahlausschussmitglied;
import de.ivu.elect.business.wahlvorschlag.control.SperrlisteExportContext;
import de.ivu.elect.business.wahlvorschlag.control.SperrlisteExportExchange;
import de.ivu.elect.business.wahlvorschlagsperson.boundary.WahlvorschlagsPersonDAO;
import de.ivu.elect.business.wahlvorschlagsperson.entity.WahlvorschlagsPerson;

@Stateless
public class SperrlisteExporter extends AbstractExporter<List<Personendaten>, SperrlisteExportContext> {

  @Inject
  private transient WahlDAO wahlDAO;

  @Inject
  private transient KandidaturDAO kandidaturDAO;

  @Inject
  private transient WahlvorschlagsPersonDAO wahlvorschlagsPersonDAO;

  @Inject
  private transient WahlausschussmitgliedDAO wahlausschussmitgliedDAO;

  @Inject
  private transient SperrlisteExportExchange exportExchange;

  public SperrlisteExporter() {
    super();
  }

  @Override
  protected DateiExportArt getDateiExportArt() {
    return DateiExportArt.SPERRLISTE_EXPORT;
  }

  @Override
  protected boolean isExportHeader() {
    return true;
  }

  @Override
  public List<Personendaten> getExportObject(SperrlisteExportContext context) {
    Wahl wahl = wahlDAO.attach(context.getWahl());

    List<Kandidatur> kandidaturen = kandidaturDAO.findByWahl(wahl)/*ELECTKOM-117*/.stream().filter(k -> k.getWahlvorschlag() != null)
        .collect(Collectors.toList());
    List<WahlvorschlagsPerson> wahlvorschlagsPersonen = wahlvorschlagsPersonDAO.findByWahlOhneUnterstuetzer(wahl);
    List<Wahlausschussmitglied> wahlausschussmitglieder = wahlausschussmitgliedDAO.findByWahl(wahl); // ELECT-16298

    List<Personendaten> result = new ArrayList<>(kandidaturen.size() + wahlvorschlagsPersonen.size() + wahlausschussmitglieder.size() + 1);
    result.addAll(kandidaturen);
    result.addAll(wahlvorschlagsPersonen);
    result.addAll(wahlausschussmitglieder);

    return result;
  }

  @Override
  public ExportExchange<List<Personendaten>, SperrlisteExportContext> getExchange() {
    return exportExchange;
  }
}
