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

import java.util.List;

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

import de.ivu.elect.business.datei.entity.DateiExport;
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.gebietsbaum.boundary.GebietDAO;
import de.ivu.elect.business.gruppe.control.GruppeByRelativerPositionComparator;
import de.ivu.elect.business.gruppe.control.GruppeExchangeContext;
import de.ivu.elect.business.gruppe.control.GruppeExportExchange;
import de.ivu.elect.business.gruppe.control.GruppeExportObject;
import de.ivu.elect.business.gruppe.entity.Gruppe;
import de.ivu.elect.business.wahl.boundary.WahlDAO;
import de.ivu.elect.business.wahl.entity.Wahl;

@Stateless
public class GruppeExporter extends AbstractExporter<GruppeExportObject, GruppeExchangeContext> {

  @Inject
  private transient GruppeDAO gruppeDAO;

  @Inject
  private transient WahlDAO wahlDAO;

  @Inject
  private transient GebietDAO gebietDAO;

  @Inject
  private transient GruppeExportExchange gruppeExportExchange;

  public GruppeExporter() {
    super();
  }

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

  @Override
  public ExportExchange<GruppeExportObject, GruppeExchangeContext> getExchange() {
    return gruppeExportExchange;
  }

  @Override
  protected void processContextAndDateiExportIfNecessary(GruppeExchangeContext context, DateiExport dateiExport) {
    super.processContextAndDateiExportIfNecessary(context, dateiExport);

    context.setNameDerExportDatei(dateiExport.getDatei().getDateiname());
  }

  @Override
  public GruppeExportObject getExportObject(GruppeExchangeContext context) {
    Wahl wahl = wahlDAO.attach(context.getWahl());

    List<Gruppe> gruppen = gruppeDAO.findByWahl(wahl);

    sort(gruppen);

    return new GruppeExportObject(gruppen, gebietDAO.findByWahl(wahl));
  }

  protected void sort(List<Gruppe> gruppen) {
    gruppen.sort(new GruppeByRelativerPositionComparator());
  }
}
