package de.ivu.elect.was.exchange.ergebnis.sitze;

import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

import javax.inject.Inject;

import de.ivu.elect.business.datei.entity.FileType;
import de.ivu.elect.business.ergebnis.control.ErgebnisExportContext;
import de.ivu.elect.business.ergebnis.control.ErgebnisExportObject;
import de.ivu.elect.business.ergebnis.entity.Sitze;
import de.ivu.elect.business.exchange.control.FileFormat;
import de.ivu.elect.business.exchange.control.FileKonfiguration;
import de.ivu.elect.business.exchange.control.MappingException;
import de.ivu.elect.business.sitzberechnung.control.SitzberechnungsalgorithmusFinder;
import de.ivu.elect.business.wahl.entity.Wahldurchfuehrung;
import de.ivu.elect.core.exchange.ergebnis.DefaultSitzeCsvImportMapper;
import de.ivu.elect.core.exchange.ergebnis.SitzeCsvDTO;
import de.ivu.elect.exchange.csv.CsvMarshaller;
import de.ivu.elect.was.exchange.ergebnis.ErgebnisExportMapper;

public class SitzeErgebnisExportMapper implements ErgebnisExportMapper {

  @Inject
  private transient SitzberechnungsalgorithmusFinder sitzberechnungsalgorithmusFinder;

  @Inject
  private transient CsvMarshaller csvMarshaller;

  @Override
  public void serialize(ErgebnisExportObject object, OutputStream os, ErgebnisExportContext context, FileKonfiguration fileKonfiguration) throws MappingException {
    csvMarshaller.serialize(SitzeCsvDTO.class, mappeEntityInternToExtern(object.getErgebnisDaten().getSitze()), os, fileKonfiguration);
  }

  private List<SitzeCsvDTO> mappeEntityInternToExtern(List<Sitze> sitzeList) {
    List<SitzeCsvDTO> result = new ArrayList<>(sitzeList.size());
    for (Sitze sitze : sitzeList) {
      SitzeCsvDTO sitzeCsvDTO = new SitzeCsvDTO();
      sitzeCsvDTO.setGebietsartName(sitze.getGebiet().getGebietsart().getName());
      sitzeCsvDTO.setGebietNummer(sitze.getGebiet().getNummer());
      sitzeCsvDTO.setGruppeSchluessel(sitze.getGruppe().getSchluessel());
      sitzeCsvDTO.setAnzahlSitze(sitze.getAnzahl());
      sitzeCsvDTO.setAnzahlAnspruch(sitze.getAnzahlAnspruch());
      result.add(sitzeCsvDTO);
    }
    return result;
  }

  @Override
  public FileFormat getFileFormat() {
    return new FileFormat(DefaultSitzeCsvImportMapper.FILE_FORMAT_NAME, FileType.CSV);
  }

  @Override
  public boolean isAcceptContext(ErgebnisExportContext context) {
    return context.getWahl() != null && sitzberechnungsalgorithmusFinder
        .getSitzberechnungsalgorithmus(context.getWahl().castTo(Wahldurchfuehrung.class).getEntity()).isVergibtSitze();
  }
}
