package de.ivu.elect.business.stimmeingabe.entity;

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;

public interface StimmeingabeImporterListenkandidaturErsetzenStrategie {

  default boolean isListenkandidaturVorhanden(Gebiet erfassungsgebiet, Map<ListenkandidaturTK, Listenkandidatur> listenkandidaturenInDbNachListenkandidaturTk,
                                              Map<ListenkandidaturNamenUndListeTK, Listenkandidatur> listenkandidaturenInDbNachNamenUndListeTk,
                                              Listenkandidatur listenkandidatur, Map<GruppeImGebietTK, GruppeImGebiet> gruppenImGebietInDb,
                                              StimmeingabeImporterGigContext gigInDbContext, StimmeingabeImporterHelper stimmeingabeImporterHelper) {
    return findeListenkandidatur(erfassungsgebiet, listenkandidatur.getListenkandidaturTK(), listenkandidatur, listenkandidaturenInDbNachListenkandidaturTk,
        listenkandidaturenInDbNachNamenUndListeTk, gruppenImGebietInDb, gigInDbContext, stimmeingabeImporterHelper) != null;
  }

  default void tauscheListenKandidatur(Stimmeingabe stimmeingabe, Map<ListenkandidaturTK, Listenkandidatur> listenkandidaturenInDbNachListenkandidaturTk,
                                       Map<ListenkandidaturNamenUndListeTK, Listenkandidatur> listenkandidaturenInDbNachNamenUndListeTk, Map<Listenkandidatur, ListenkandidaturTK> listenkandidaturAusDateiTKCache, Map<GruppeImGebietTK, GruppeImGebiet> gruppenImGebietInDb, StimmeingabeImporterGigContext gigInDbContext, StimmeingabeImporterHelper stimmeingabeImporterHelper) {
    Listenkandidatur listenkandidaturInDatei = stimmeingabe.getListenkandidatur();
    if (listenkandidaturInDatei == null) {
      return;
    }

    ListenkandidaturTK listenkandidaturTk = listenkandidaturAusDateiTKCache.computeIfAbsent(listenkandidaturInDatei, Listenkandidatur::getListenkandidaturTK);

    Listenkandidatur listenkandidaturInDb = findeListenkandidatur(stimmeingabe.getGebiet(), listenkandidaturTk, listenkandidaturInDatei, listenkandidaturenInDbNachListenkandidaturTk, listenkandidaturenInDbNachNamenUndListeTk, gruppenImGebietInDb, gigInDbContext, stimmeingabeImporterHelper);
    // ELECTDD-124
    if (listenkandidaturInDb != null) {
      listenkandidaturAusDateiTKCache.put(listenkandidaturInDatei, listenkandidaturInDb.getListenkandidaturTK());
    }

    stimmeingabe.setListenkandidatur(listenkandidaturInDb);
  }

  Listenkandidatur findeListenkandidatur(Gebiet erfassungsgebiet, ListenkandidaturTK listenkandidaturTk, Listenkandidatur listenkandidaturInDatei, Map<ListenkandidaturTK, Listenkandidatur> listenkandidaturenInDbNachListenkandidaturTk, Map<ListenkandidaturNamenUndListeTK, Listenkandidatur> listenkandidaturenInDbNachNamenUndListeTk, Map<GruppeImGebietTK, GruppeImGebiet> gruppenImGebietInDb, StimmeingabeImporterGigContext gigInDbContext, StimmeingabeImporterHelper stimmeingabeImporterHelper);

}
