package de.ivu.elect.was.exchange.stimmeingabe;

import java.util.Map;

import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gruppeimgebiet.entity.GruppeImGebiet;
import de.ivu.elect.business.gruppeimgebiet.entity.GruppeImGebietTK;
import de.ivu.elect.business.kandidatur.control.ListenkandidaturNamenUndListeTK;
import de.ivu.elect.business.kandidatur.entity.Listenkandidatur;
import de.ivu.elect.business.kandidatur.entity.ListenkandidaturTK;
import de.ivu.elect.business.stimmeingabe.control.StimmeingabeImporterHelper;
import de.ivu.elect.business.stimmeingabe.entity.StimmeingabeImporterGigContext;
import de.ivu.elect.business.stimmeingabe.entity.StimmeingabeImporterListenkandidaturErsetzenStrategie;

public class NlStimmeingabeImporterListenkandidaturErsetzenStrategie implements StimmeingabeImporterListenkandidaturErsetzenStrategie {

  @Override
  public Listenkandidatur findeListenkandidaturInternal(Gebiet erfassungsgebiet,
                                                        ListenkandidaturTK listenkandidaturTk,
                                                        Listenkandidatur listenkandidaturInDatei,
                                                        Map<ListenkandidaturTK, Listenkandidatur> listenkandidaturenInDbNachListenkandidaturTk,
                                                        Map<ListenkandidaturNamenUndListeTK, Listenkandidatur> listenkandidaturenInDbNachNamenUndListeTk,
                                                        Map<GruppeImGebietTK, GruppeImGebiet> gruppenImGebietInDb,
                                                        StimmeingabeImporterGigContext gigInDbContext,
                                                        StimmeingabeImporterHelper stimmeingabeImporterHelper) {
    return listenkandidaturenInDbNachListenkandidaturTk.values().stream() //
        .filter(listenkandidaturInDb -> listenkandidaturInDb.getRelativePosition().equals(listenkandidaturInDatei.getRelativePosition())) //
        .filter(listenkandidaturInDb -> isGruppePasst(listenkandidaturInDatei, listenkandidaturInDb)) //
        .filter(listenkandidaturInDb -> listenkandidaturInDb.getGebiet().isInGebietshierarchieUebergeordnetesGebietVon(erfassungsgebiet)) //
        .findFirst().orElse(null);
  }

  private boolean isGruppePasst(Listenkandidatur listenkandidaturInDatei, Listenkandidatur listenkandidaturInDb) {
    return listenkandidaturInDb.getGruppe().getSchluessel()
        .equalsIgnoreCase(listenkandidaturInDatei.getGruppe().getSchluessel()) || isGruppenPositionGleich(listenkandidaturInDatei, listenkandidaturInDb);
  }

  private boolean isGruppenPositionGleich(Listenkandidatur listenkandidaturInDatei, Listenkandidatur listenkandidaturInDb) {
    // ELECT-13518
    return listenkandidaturInDatei.getGruppeImGebiet().getVorgegebenePosition() != null && listenkandidaturInDatei.getGruppeImGebiet()
        .getVorgegebenePosition().equals(listenkandidaturInDb.getGruppeImGebiet().getVorgegebenePosition());
  }
}

