
package de.ivu.elect.exchange.staat;

import static de.ivu.elect.business.staat.entity.AbstractStaatenGruppe.DEFAULT_EXCHANGE_FORMAT;
import static java.util.Objects.nonNull;
import static org.apache.commons.lang3.StringUtils.isNotBlank;

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.exchange.control.FileFormat;
import de.ivu.elect.business.exchange.control.FileKonfiguration;
import de.ivu.elect.business.exchange.control.MappingException;
import de.ivu.elect.business.staat.control.StaatenGruppeExportContext;
import de.ivu.elect.business.staat.entity.Staat;
import de.ivu.elect.business.staat.entity.StaatenGruppe;
import de.ivu.elect.exchange.csv.CsvMarshaller;

public class DefaultStaatenGruppeCsvExportMapper implements StaatenGruppeExportMapper {

  public static final String FORMAT_NAME = DEFAULT_EXCHANGE_FORMAT;

  @Inject
  private transient CsvMarshaller csvMarshaller;

  public DefaultStaatenGruppeCsvExportMapper() {
    super();
  }

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

  @Override
  public boolean isAcceptContext(StaatenGruppeExportContext context) {
    return nonNull(context.getWahl()) || nonNull(context.getWahltermin());
  }

  @Override
  public void serialize(List<StaatenGruppe> staatenGruppes, OutputStream os, StaatenGruppeExportContext staatengruppeExportContext, FileKonfiguration fileKonfiguration) throws MappingException {
    csvMarshaller.serialize(DefaultStaatenGruppeCsvDTO.class, mapEntityToDto(staatenGruppes), os, fileKonfiguration);
  }

  private List<DefaultStaatenGruppeCsvDTO> mapEntityToDto(List<StaatenGruppe> entities) {
    List<DefaultStaatenGruppeCsvDTO> result = new ArrayList<>();

    for (StaatenGruppe staatenGruppe : entities) {
      for (Staat staat : staatenGruppe.getStaats()) {
        if (isNotBlank(staat.getIso3166Alpha2())) {
          result.add(new DefaultStaatenGruppeCsvDTO(staatenGruppe.getBezeichnung(), staatenGruppe.getStaatenGruppeTyp().name(), staat.getIso3166Alpha2()));
        }
      }
    }

    return result;
  }
}
