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

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;

public class NlListeIdentischCache {

  private final Map<NlListeIdentischCacheKey, Boolean> cache = new HashMap<>();

  public boolean add(Liste liste1, Liste liste2, boolean result) {
    putResult(liste1, liste2, result);

    // transitivität
    if (result) {
      for (Map.Entry<NlListeIdentischCacheKey, Boolean> entry : new HashSet<>(cache.entrySet())) {
        if (entry.getValue()) {
          if (entry.getKey().getListe1().equals(liste1)) {
            putResult(liste2, entry.getKey().getListe2(), true);
          }
          if (entry.getKey().getListe1().equals(liste2)) {
            putResult(liste1, entry.getKey().getListe2(), true);
          }
          if (entry.getKey().getListe2().equals(liste1)) {
            putResult(liste2, entry.getKey().getListe1(), true);
          }
          if (entry.getKey().getListe2().equals(liste2)) {
            putResult(liste1, entry.getKey().getListe1(), true);
          }
        }
      }
    }
    return result;
  }

  private void putResult(Liste liste1, Liste liste2, boolean result) {
    NlListeIdentischCacheKey key1 = new NlListeIdentischCacheKey(liste1, liste2);
    NlListeIdentischCacheKey key2 = new NlListeIdentischCacheKey(liste1, liste2);
    cache.put(key1, result);
    cache.put(key2, result);
  }

  public Boolean getCachedResult(Liste liste1, Liste liste2) {
    return cache.get(new NlListeIdentischCacheKey(liste1, liste2));
  }

}
