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.exchange.gebietsbaum.PruefkennzifferGebietDTO;
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<PruefkennzifferGebietDTO> {

  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) {
    return context.getWahl() != null; // ELECT-14078
  }

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

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

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

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

    Map<String, List<PruefkennzifferGebietDTO>> groupedByPruefkennzeichen = dtos.stream().filter(d -> d.getPruefkennzeichen() != null)
        .collect(Collectors.groupingBy(PruefkennzifferGebietDTO::getPruefkennzeichen));

    for (Entry<String, List<PruefkennzifferGebietDTO>> dtosPerPruefkennzeichen : groupedByPruefkennzeichen.entrySet()) {
      List<PruefkennzifferGebietDTO> 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(PruefkennzifferGebietDTO dto) {
    Gebiet gebiet = new Gebiet(EmptyCustomData.INSTANCE);

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

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

    return gebiet;
  }
}
