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

import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
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.gebietsbaum.boundary.GebietImportAktualisierenArt;
import de.ivu.elect.business.gebietsbaum.control.GebietsbaumExchangeContext;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gebietsbaum.entity.Gebietsart;
import de.ivu.elect.business.wahl.boundary.UmgangAWerteKonfiguration;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.exchange.gebietsbaum.csv.AbstractGebietAktualisierenCsvImportMapper;
import de.ivu.elect.jee.entity.customdata.EmptyCustomData;
import de.ivu.elect.jee.exchange.Violations;

public class CoreGebietPruefkennzeichenAktualisierenCsvImportMapper extends AbstractGebietAktualisierenCsvImportMapper<GebietPruefkennzeichenAktualisierenCsvDTO> {

  public static final String FILE_FORMAT_NAME = "file.format.gebiet.pruefkennzeichen.aktualisieren";

  public static final FileFormat FILE_FORMAT = new FileFormat(FILE_FORMAT_NAME, FileType.CSV);

  @Inject
  private transient UmgangAWerteKonfiguration umgangAWerteKonfiguration;

  public CoreGebietPruefkennzeichenAktualisierenCsvImportMapper() {
    super();
  }

  @Override
  protected boolean isAcceptContextWurzelgebietVorhanden(GebietsbaumExchangeContext context) {
    Wahl wahl = context.getWahl();

    if (wahl != null) {
      return wahl.getWahlart() != null && umgangAWerteKonfiguration.isPruefkennzeichenWahlberechtigteImportNotwendig(wahl);
    }

    return false;
  }

  @Override
  public FileFormat getFileFormat() {
    return FILE_FORMAT;
  }

  @Override
  public GebietImportAktualisierenArt getGebietImportAktualisierenArt() {
    return GebietImportAktualisierenArt.PRUEFZIFFERN_AKTUALISIEREN;
  }

  @Override
  protected Class<GebietPruefkennzeichenAktualisierenCsvDTO> getDtoClass() {
    return GebietPruefkennzeichenAktualisierenCsvDTO.class;
  }

  @Override
  protected Violations validateDTOs(List<GebietPruefkennzeichenAktualisierenCsvDTO> dtos, GebietsbaumExchangeContext context) {
    Violations violations = new Violations();

    Map<String, List<GebietPruefkennzeichenAktualisierenCsvDTO>> groupedByPruefkennzeichen = dtos.stream()
        .collect(Collectors.groupingBy(GebietPruefkennzeichenAktualisierenCsvDTO::getPruefkennzeichen));

    for (Entry<String, List<GebietPruefkennzeichenAktualisierenCsvDTO>> dtosPerPruefkennzeichen : groupedByPruefkennzeichen.entrySet()) {
      List<GebietPruefkennzeichenAktualisierenCsvDTO> potenzielleDuplikate = dtosPerPruefkennzeichen.getValue();

      if (potenzielleDuplikate.size() > 1) {
        violations.addWarning("gebiet.import.pruefkennzeichen.aktualisierer.pruefkennzeichen.nicht.eindeutig", dtosPerPruefkennzeichen.getKey(), potenzielleDuplikate.get(0).getNummer(),
            potenzielleDuplikate.get(1).getNummer());
      }
    }

    return violations;
  }

  @Override
  protected Gebiet mapDtoToGebiet(GebietPruefkennzeichenAktualisierenCsvDTO dto) {
    Gebiet gebiet = new Gebiet(EmptyCustomData.INSTANCE);

    Gebietsart gebietsart = new Gebietsart();
    gebietsart.setName(dto.getGebietsartName());

    gebiet.setGebietsart(gebietsart);
    gebiet.setNummer(dto.getNummer());
    gebiet.setExterneId(dto.getPruefkennzeichen());

    return gebiet;
  }
}
