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

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.control.Gebietsbaum;
import de.ivu.elect.business.gebietsbaum.control.GebietsbaumExchangeContext;
import de.ivu.elect.business.gebietsbaum.control.GebietsbaumExportExchange;
import de.ivu.elect.business.gebietsbaum.control.GebietsbaumFactory;
import de.ivu.elect.business.wahl.boundary.WahlterminDAO;
import de.ivu.elect.business.wahl.control.WahlAttacher;

@Stateless
public class GebietsbaumExporter extends AbstractExporter<Gebietsbaum, GebietsbaumExchangeContext> {

  @Inject
  private transient GebietsbaumFactory gebietsbaumFactory;

  @Inject
  private transient GebietsbaumExportExchange gebietsbaumExportExchange;

  @Inject
  private transient WahlAttacher wahlDAO;

  @Inject
  private transient WahlterminDAO wahlterminDAO;

  @Override
  protected ExportExchange<Gebietsbaum, GebietsbaumExchangeContext> getExchange() {
    return gebietsbaumExportExchange;
  }

  @Override
  protected Gebietsbaum getExportObject(GebietsbaumExchangeContext context) {
    if (context.getWahl() != null) {
      return gebietsbaumFactory.createFromWahl(wahlDAO.attach(context.getWahl()));
    } else {
      return gebietsbaumFactory.createFromWahltermin(wahlterminDAO.attach(context.getWahltermin()));
    }
  }

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

  @Override
  protected void processContextAndDateiExportIfNecessary(GebietsbaumExchangeContext context, DateiExport dateiExport) {
    super.processContextAndDateiExportIfNecessary(context, dateiExport);
    context.setNameDerExportDatei(dateiExport.getDatei().getDateiname());
  }

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