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

import java.io.Serializable;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Objects;
import java.util.Set;

import de.ivu.elect.business.stimmeingabe.boundary.NlVoteType;

public class EmlErgebnisDifferenz implements Serializable {

  private static final long serialVersionUID = 1L;

  private final Map<String, EmlErgebnisDifferenzVorherNachher> listenstimmenUnterschiede = new LinkedHashMap<>();

  private final Map<String, Map<String, EmlErgebnisDifferenzVorherNachher>> kandidatenStimmenUnterschied = new LinkedHashMap<>();

  private final Map<NlVoteType, EmlErgebnisDifferenzVorherNachher> voteTypeUnterschiede = new LinkedHashMap<>();

  public void addListenstimmenUnterschied(String affiliationIdentifier, Long wertVorher, Long wertNachher) {
    if (!Objects.equals(wertVorher, wertNachher)) {
      listenstimmenUnterschiede.put(affiliationIdentifier, new EmlErgebnisDifferenzVorherNachher(wertVorher, wertNachher));
    }
  }

  public void addListenkandidaturstimmenUnterschied(String affiliationIdentifier, String candidateIdentifier, Long wertVorher, Long wertNachher) {
    if (!Objects.equals(wertVorher, wertNachher)) {
      kandidatenStimmenUnterschied.computeIfAbsent(affiliationIdentifier, x -> new LinkedHashMap<>()).put(candidateIdentifier,
          new EmlErgebnisDifferenzVorherNachher(wertVorher, wertNachher));
    }
  }

  public void addVoteTypeUnterschied(NlVoteType voteType, Long wertVorher, Long wertNachher) {
    if (!Objects.equals(wertVorher, wertNachher)) {
      voteTypeUnterschiede.put(voteType, new EmlErgebnisDifferenzVorherNachher(wertVorher, wertNachher));
    }
  }

  public Map<String, EmlErgebnisDifferenzVorherNachher> getListenstimmenUnterschiede() {
    return listenstimmenUnterschiede;
  }

  public Map<String, Map<String, EmlErgebnisDifferenzVorherNachher>> getKandidatenStimmenUnterschied() {
    return kandidatenStimmenUnterschied;
  }

  public Map<NlVoteType, EmlErgebnisDifferenzVorherNachher> getVoteTypeUnterschiede() {
    return voteTypeUnterschiede;
  }

  public Set<String> getListenMitUnterschieden() {
    Set<String> result = new HashSet<>();
    result.addAll(listenstimmenUnterschiede.keySet());
    result.addAll(kandidatenStimmenUnterschied.keySet());
    return result;
  }

  @Override
  public String toString() {
    return "EmlErgebnisDifferenz{" +
        "listenstimmenUnterschiede=" + listenstimmenUnterschiede +
        ", kandidatenStimmenUnterschied=" + kandidatenStimmenUnterschied +
        ", voteTypeUnterschiede=" + voteTypeUnterschiede +
        '}';
  }
}
