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

import java.util.Map;

import de.ivu.elect.business.gruppeimgebiet.entity.GruppeImGebiet;
import de.ivu.elect.business.gruppeimgebiet.entity.GruppeImGebietTK;
import de.ivu.elect.business.stimmeingabe.control.StimmeingabeImporterHelper;
import de.ivu.elect.business.wahlvorschlag.entity.ReferendumOption;
import de.ivu.elect.business.wahlvorschlag.entity.ReferendumOptionTK;

public enum StandardStimmeingabeImporterReferendumOptionErsetzenStrategie implements StimmeingabeImporterReferendumOptionErsetzenStrategie {

  NACH_TK {
    @Override
    public boolean isReferendumOptionVorhanden(Map<ReferendumOptionTK, ReferendumOption> referendumOptionenInDbNachReferendumOptionTK, ReferendumOption referendumOption, Map<GruppeImGebietTK, GruppeImGebiet> gruppeImGebietInDb, StimmeingabeImporterGigContext gigInDbContext, StimmeingabeImporterHelper stimmeingabeImporterHelper) {
      return referendumOptionenInDbNachReferendumOptionTK.containsKey(referendumOption.getReferendumOptionTK());
    }

    @Override
    public ReferendumOption findeReferendumOption(ReferendumOptionTK referendumOptionTK, ReferendumOption referendumOptionInDatei, Map<ReferendumOptionTK, ReferendumOption> referendumOptionInDbNachReferendumOptionTk, Map<GruppeImGebietTK, GruppeImGebiet> gruppenImGebietInDb, StimmeingabeImporterGigContext gigInDbContext, StimmeingabeImporterHelper stimmeingabeImporterHelper) {
      return referendumOptionInDbNachReferendumOptionTk.get(referendumOptionTK);
    }
  },

  NACH_TK_FALLBACK_NACH_POSITION {
    @Override
    public boolean isReferendumOptionVorhanden(Map<ReferendumOptionTK, ReferendumOption> referendumOptionenInDbNachReferendumOptionTK, ReferendumOption referendumOption, Map<GruppeImGebietTK, GruppeImGebiet> gruppeImGebietInDb, StimmeingabeImporterGigContext gigInDbContext, StimmeingabeImporterHelper stimmeingabeImporterHelper) {
      return NACH_TK.isReferendumOptionVorhanden(referendumOptionenInDbNachReferendumOptionTK, referendumOption, gruppeImGebietInDb, gigInDbContext, stimmeingabeImporterHelper)
          || NACH_GRUPPE_IM_GEBIET_POSITION_UND_REFERENDUM_OPTION_POSITION.isReferendumOptionVorhanden(referendumOptionenInDbNachReferendumOptionTK, referendumOption, gruppeImGebietInDb, gigInDbContext, stimmeingabeImporterHelper);
    }

    @Override
    public ReferendumOption findeReferendumOption(ReferendumOptionTK referendumOptionTK, ReferendumOption referendumOptionInDatei, Map<ReferendumOptionTK, ReferendumOption> referendumOptionInDbNachReferendumOptionTk, Map<GruppeImGebietTK, GruppeImGebiet> gruppenImGebietInDb, StimmeingabeImporterGigContext gigInDbContext, StimmeingabeImporterHelper stimmeingabeImporterHelper) {
      ReferendumOption result = NACH_TK.findeReferendumOption(referendumOptionTK, referendumOptionInDatei, referendumOptionInDbNachReferendumOptionTk, gruppenImGebietInDb, gigInDbContext, stimmeingabeImporterHelper);
      if (result == null) {
        result = NACH_GRUPPE_IM_GEBIET_POSITION_UND_REFERENDUM_OPTION_POSITION.findeReferendumOption(referendumOptionTK, referendumOptionInDatei, referendumOptionInDbNachReferendumOptionTk, gruppenImGebietInDb, gigInDbContext, stimmeingabeImporterHelper);
      }
      return result;
    }
  },

  NACH_GRUPPE_IM_GEBIET_POSITION_UND_REFERENDUM_OPTION_POSITION {
    @Override
    public boolean isReferendumOptionVorhanden(Map<ReferendumOptionTK, ReferendumOption> referendumOptionenInDbNachReferendumOptionTK, ReferendumOption referendumOption, Map<GruppeImGebietTK, GruppeImGebiet> gruppenImGebietInDb, StimmeingabeImporterGigContext gigInDbContext, StimmeingabeImporterHelper stimmeingabeImporterHelper) {
      return findeReferendumOption(referendumOption.getReferendumOptionTK(), referendumOption, referendumOptionenInDbNachReferendumOptionTK, gruppenImGebietInDb, gigInDbContext, stimmeingabeImporterHelper) != null;
    }

    @Override
    public ReferendumOption findeReferendumOption(ReferendumOptionTK referendumOptionTK, ReferendumOption referendumOptionInDatei, Map<ReferendumOptionTK, ReferendumOption> referendumOptionInDbNachReferendumOptionTk, Map<GruppeImGebietTK, GruppeImGebiet> gruppenImGebietInDb, StimmeingabeImporterGigContext gigInDbContext, StimmeingabeImporterHelper stimmeingabeImporterHelper) {
      final GruppeImGebiet gruppeImGebietInDatei = referendumOptionInDatei.getGruppeImGebiet();
      if (gruppeImGebietInDatei != null && gruppeImGebietInDatei.getVorgegebenePosition() != null && referendumOptionInDatei.getPosition() != null) {
        final GruppeImGebiet gruppeImGebietInDb = StandardStimmeingabeImporterGruppeImGebietErsetzenStrategie.ERSETZE_GRUPPE_IM_GEBIET_NACH_POSITION.findGruppeImGebiet(gruppeImGebietInDatei, gruppenImGebietInDb, gigInDbContext, stimmeingabeImporterHelper);
        if (gruppeImGebietInDb != null) {
          return referendumOptionInDbNachReferendumOptionTk.values().stream()
              .filter(referendumOptionInDb -> gruppeImGebietInDb.equals(referendumOptionInDb.getGruppeImGebiet())
                  || referendumOptionInDb.getGruppe().getGruppeTK().equals(gruppeImGebietInDb.getGruppe().getGruppeTK()) && referendumOptionInDb.getGebiet().isInGebietshierarchieUebergeordnetesGebietVon(gruppeImGebietInDb.getGebiet()))
              .filter(referendumOptionInDb -> referendumOptionInDatei.getPosition().equals(referendumOptionInDb.getPosition()))
              .findAny().orElse(null);
        }
      }
      return null;
    }
  };
}
