package de.ivu.elect.presentation.stimmeingabe.status;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import javax.enterprise.event.Observes;
import javax.enterprise.event.Reception;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import de.ivu.elect.business.stimmeingabe.entity.Ergebniseingang;
import de.ivu.elect.business.stimmeingabe.entity.ErgebniseingangPK;
import de.ivu.elect.business.stimmeingabe.entity.Stimmeingabe;
import de.ivu.elect.business.system.entity.AfterCacheResetEvent;


import static org.apache.commons.lang3.StringUtils.isNotBlank;

public class GebietErfassungsstatusVollstaendigCache {

  private static final Logger LOG = LoggerFactory.getLogger(GebietErfassungsstatusVollstaendigCache.class);

  private static final Map<ErgebniseingangPK, Boolean> VOLLSTAENDIG_CACHE = new ConcurrentHashMap<>(); // nur relevant bei BE AGH-Wahl, Ergebniseingang verändert sich nicht mehr, daher kein Löschen des Caches notwendig

  /**
   * Ein Ergebniseingang ist dann vollstaendig, wenn er sowohl Erst- als auch Zweitestimmen enthält. Diese Prüfung ist natürlich nur für Wahlen mit Erst- und Zweitstimmen sinnvoll.
   */
  protected static boolean isVollstaendig(Ergebniseingang neuesterErgebniseingang) {
    // Kommt *nur* bei der AGH-Wahl in Berlin vor
    return VOLLSTAENDIG_CACHE.computeIfAbsent(neuesterErgebniseingang.getPk(), x -> {

      boolean hatDirektstimme = false;
      boolean hatListenstimme = false;

      for (Stimmeingabe stimmeingabe : neuesterErgebniseingang.getStimmeingaben()) {
        if (isNotBlank(stimmeingabe.getAnzahlEingabe())) {
          if (!hatDirektstimme) {
            hatDirektstimme = stimmeingabe.getStimmenart().isDirektstimme() && stimmeingabe.getAnzahl() != 0L;

            if (hatDirektstimme && hatListenstimme) {
              return true;
            }
          }

          if (!hatListenstimme) {
            hatListenstimme = stimmeingabe.getStimmenart().isListenstimme() && stimmeingabe.getAnzahl() != 0L;

            if (hatDirektstimme && hatListenstimme) {
              return true;
            }
          }
        }
      }

      return false;
    });
  }

  public void listen(@Observes(notifyObserver = Reception.ALWAYS) AfterCacheResetEvent event) {
    reset();
  }

  protected void reset() {
    LOG.info("Reset Cache");
    VOLLSTAENDIG_CACHE.clear();
  }
}
