
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);
  }

  private boolean matchesStaatsangehoerigkeit(Personendaten personendaten) {
    return isStaatsangehoerigkeitNurInlandZugelassen() && personendaten.isDeutscher()
        || isStaatsangehoerigkeitNurEuZugelassen() && personendaten.isEuBuerger()
        || isStaatsangehoerigkeitNurAuslandZugelassen() && !personendaten.isDeutscher();
  }

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

  private boolean isStaatsangehoerigkeitNurInlandZugelassen() {
    return WahlrechtStaatsangehoerigkeit.DEUTSCH.equals(getWahlrechtStaatsangehoerigkeit());
  }

  private boolean isStaatsangehoerigkeitNurEuZugelassen() {
    return WahlrechtStaatsangehoerigkeit.EU.equals(getWahlrechtStaatsangehoerigkeit());
  }

  private boolean isStaatsangehoerigkeitNurAuslandZugelassen() {
    return WahlrechtStaatsangehoerigkeit.AUSLAND.equals(getWahlrechtStaatsangehoerigkeit());
  }

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

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