package de.ivu.elect.core.exchange.wahlbeteiligung.csv;

import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.stream.Collectors;

import javax.inject.Inject;

import de.ivu.elect.business.datei.entity.FileType;
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.wahlbeteiligung.entity.WahlbeteiligungVerlauf;
import de.ivu.elect.business.wahlbeteiligung.entity.WahlbeteiligungVerlaufExchangeContext;
import de.ivu.elect.business.wahlbeteiligung.entity.WahlbeteiligungVerlaufGebiet;
import de.ivu.elect.core.exchange.wahlbeteiligung.WahlbeteiligungVerlaufExportMapper;
import de.ivu.elect.core.exchange.wahlbeteiligung.xml.DefaulXmlWahlbeteiligungVerlaufExportMapper;
import de.ivu.elect.exchange.csv.CsvMarshaller;

public class DefaultCsvWahlbeteiligungVerlaufExportMapper implements WahlbeteiligungVerlaufExportMapper {

  @Inject
  private transient CsvMarshaller csvMarshaller;

  @Override
  public void serialize(List<WahlbeteiligungVerlauf> wahlbeteiligungVerlaufs, OutputStream os, WahlbeteiligungVerlaufExchangeContext wahlbeteiligungVerlaufExchangeContext, FileKonfiguration fileKonfiguration) throws MappingException {

    List<WahlbeteiligungVerlaufDTO> dtos = wahlbeteiligungVerlaufs.stream()
        .flatMap(wahlbeteiligungVerlauf -> wahlbeteiligungVerlauf.getWahlbeteiligungVerlaufGebietsByWahlbeteiligungVerlauf().stream())
        .filter(wvg -> wvg.getWahlbeteilung() != null)
        .map(this::mappe)
        .collect(Collectors.toList());

    csvMarshaller.serialize(WahlbeteiligungVerlaufDTO.class, dtos, os, fileKonfiguration);
  }

  private WahlbeteiligungVerlaufDTO mappe(WahlbeteiligungVerlaufGebiet wahlbeteiligungVerlaufGebiet) {
    WahlbeteiligungVerlaufDTO result = new WahlbeteiligungVerlaufDTO();
    result.setTyp(wahlbeteiligungVerlaufGebiet.getWahlbeteiligungVerlauf().getTyp().name());
    result.setGebietArt(wahlbeteiligungVerlaufGebiet.getGebiet().getGebietsart().getName());
    result.setGebietNummer(wahlbeteiligungVerlaufGebiet.getGebiet().getNummer());
    result.setZeitpunkt(new SimpleDateFormat(DefaultCsvWahlbeteiligungVerlaufImportMapper.DATE_PATTERN)
        .format(wahlbeteiligungVerlaufGebiet.getWahlbeteiligungVerlauf().getDatum()));
    result.setWahlname(wahlbeteiligungVerlaufGebiet.getWahlbeteiligungVerlauf().getName());
    if (wahlbeteiligungVerlaufGebiet.getWahlbeteilung() != null) {
      result.setWahlbeteiligung(wahlbeteiligungVerlaufGebiet.getWahlbeteilung().toString());
    }

    return result;
  }

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

  @Override
  public boolean isAcceptContext(WahlbeteiligungVerlaufExchangeContext wahlbeteiligungVerlaufExchangeContext) {
    return wahlbeteiligungVerlaufExchangeContext.getWahl() != null;
  }
}
