
package de.ivu.elect.business.personenpruefung.control.wahlrecht.kriterium;

import static java.util.Objects.requireNonNull;

import java.util.Collection;

import de.ivu.elect.business.person.entity.Personendaten;
import de.ivu.elect.business.personenpruefung.control.AbstractPersonendatenMatcherKriterium;
import de.ivu.elect.business.personenpruefung.control.wahlrecht.WahlrechtStaatsangehoerigkeit;
import de.ivu.elect.jee.faces.Messages;

public class StaatsangehoerigkeitKriterium extends AbstractPersonendatenMatcherKriterium {

  private static final long serialVersionUID = 1L;

  private final WahlrechtStaatsangehoerigkeit wahlrechtStaatsangehoerigkeit;

  public StaatsangehoerigkeitKriterium(Collection<Class< ? extends Personendaten>> personendatenClasses,
      WahlrechtStaatsangehoerigkeit wahlrechtStaatsangehoerigkeit) {
    super(personendatenClasses);

    requireNonNull(wahlrechtStaatsangehoerigkeit, "WahlrechtStaatsangehoerigkeit darf nicht null sein");

    this.wahlrechtStaatsangehoerigkeit = wahlrechtStaatsangehoerigkeit;
  }

  public WahlrechtStaatsangehoerigkeit getWahlrechtStaatsangehoerigkeit() {
    return wahlrechtStaatsangehoerigkeit;
  }

  @Override
  protected boolean matchesInternal(Personendaten personendaten) {
    return isStaatsangehoerigkeitAlleZugelassen() || personendaten.hasStaatsangehoerigkeit() && matchesStaatsangehoerigkeit(personendaten)
        || !personendaten.hasStaatsangehoerigkeit() && getWahlrechtStaatsangehoerigkeit().isUnbekanntZugelassen();
  }

  private boolean matchesStaatsangehoerigkeit(Personendaten personendaten) {
    return personendaten.isDeutscher() && getWahlrechtStaatsangehoerigkeit().isDeutschZugelassen()
        || personendaten.isEuBuerger() && getWahlrechtStaatsangehoerigkeit().isEuZugelassen()
        || !personendaten.isDeutscher() && getWahlrechtStaatsangehoerigkeit().isAuslandZugelassen();
  }

  private boolean isStaatsangehoerigkeitAlleZugelassen() {
    return WahlrechtStaatsangehoerigkeit.ALLE.equals(getWahlrechtStaatsangehoerigkeit());
  }

  @Override
  public String getDescription(Messages messages) {
    return messages.getMessageForMessageKey(getDescriptionMsgKey(), messages.lokalisiere(getWahlrechtStaatsangehoerigkeit()));
  }

  @Override
  public String toString() {
    return getClass().getSimpleName() + " [wahlrechtStaatsangehoerigkeit = " + getWahlrechtStaatsangehoerigkeit() + "]";
  }
}
