
package de.ivu.elect.core.exchange.stimmen.csv.dynamic;

import static de.ivu.elect.core.exchange.stimmen.csv.dynamic.DefaultDynamicStimmenExportDTOFactory.HEADER_ERFASSUNGSGEBIETSART;
import static de.ivu.elect.core.exchange.stimmen.csv.dynamic.DefaultDynamicStimmenExportDTOFactory.HEADER_GEMEINDE;
import static de.ivu.elect.core.exchange.stimmen.csv.dynamic.DefaultDynamicStimmenExportDTOFactory.HEADER_STIMBEZIRKSNUMMER;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.Nonnull;
import javax.inject.Inject;

import de.ivu.elect.business.gebietsbaum.boundary.WahlverwaltungGebietInformationResolver;
import de.ivu.elect.business.wahl.entity.Wahldurchfuehrung;

public class DefaultDynamicStimmenCsvImportMapper extends AbstractDynamicStimmenCsvImportMapper<DefaultDynamicStimmenImportDTOParser> {

  private static final long serialVersionUID = 1L;

  @Inject
  protected transient WahlverwaltungGebietInformationResolver wahlverwaltungGebietInformationResolver;

  public DefaultDynamicStimmenCsvImportMapper() {
    super();
  }

  @Override
  protected boolean isAcceptWahl(@Nonnull Wahldurchfuehrung wahldurchfuehrung) {
    return wahldurchfuehrung.isReferendum() || wahldurchfuehrung.isWahlMitDirektkandidatengebieten() || wahldurchfuehrung.isWahlMitListengebieten();
  }

  @Override
  protected String getFileFormatName() {
    return DefaultDynamicStimmenCsvExportMapper.FORMAT_NAME;
  }

  @Override
  protected DefaultDynamicStimmenImportDTOParser createDtoParser(Wahldurchfuehrung wahldurchfuehrung) {
    return new DefaultDynamicStimmenImportDTOParser(wahldurchfuehrung, wahlverwaltungGebietInformationResolver);
  }

  @Override
  public List<String> inkorrekteHeaderSpalten(List<String> header) {
    List<String> result = new ArrayList<>();

    if (!header.contains(HEADER_GEMEINDE)) {
      result.add(HEADER_GEMEINDE);
    }

    if (!header.contains(HEADER_STIMBEZIRKSNUMMER)) {
      result.add(HEADER_STIMBEZIRKSNUMMER);
    }

    if (!header.contains(HEADER_ERFASSUNGSGEBIETSART)) {
      result.add(HEADER_ERFASSUNGSGEBIETSART);
    }

    return result;
  }
}
