
package de.ivu.elect.business.kandidatur.control;

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

import de.ivu.elect.business.kandidatur.entity.Kandidatur;
import de.ivu.elect.business.person.entity.PersonenVerknuepfung;
import de.ivu.elect.business.person.entity.Personendaten;
import de.ivu.elect.business.person.entity.PersonendatenPK;

public class KandidatenVerknuepfungUtil {

  private KandidatenVerknuepfungUtil() {
    super();
  }

  public static Map<PersonendatenPK, Kandidatur> mappeKandidaturen(Collection<PersonenVerknuepfung> personenVerknuepfungen) {
    Map<PersonendatenPK, Kandidatur> result = new HashMap<>();

    for (PersonenVerknuepfung personenVerknuepfung : personenVerknuepfungen) {
      addPerson(result, personenVerknuepfung.getPerson1());
      addPerson(result, personenVerknuepfung.getPerson2());
    }

    return result;
  }

  private static void addPerson(Map<PersonendatenPK, Kandidatur> result, Personendaten person) {
    result.put(person.getPk(), (Kandidatur) person);
  }

  public static Map<PersonendatenPK, Set<PersonenVerknuepfung>> mappePersonenverknuepfungenNachPersonenPK(Collection<PersonenVerknuepfung> personenVerknuepfungen) {
    Map<PersonendatenPK, Set<PersonenVerknuepfung>> result = new HashMap<>();

    for (PersonenVerknuepfung personenVerknuepfung : personenVerknuepfungen) {
      fuegePersonEin(personenVerknuepfung.getPerson1(), personenVerknuepfung, result);
      fuegePersonEin(personenVerknuepfung.getPerson2(), personenVerknuepfung, result);
    }

    return result;
  }

  private static void fuegePersonEin(Personendaten person, PersonenVerknuepfung personenVerknuepfung, Map<PersonendatenPK, Set<PersonenVerknuepfung>> result) {
    if (person != null) {
      PersonendatenPK key = person.getPk();

      Set<PersonenVerknuepfung> value = result.get(key);

      if (value == null) {
        value = new HashSet<>();

        result.put(key, value);
      }

      value.add(personenVerknuepfung);
    }
  }
}
