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

import static java.util.Arrays.asList;
import static java.util.Collections.emptyList;

import java.util.List;

import de.ivu.elect.business.kandidatur.entity.Kandidatur;
import de.ivu.elect.business.person.entity.Personendaten;
import de.ivu.elect.business.person.entity.Wahlrechtsausschluss;
import de.ivu.elect.business.personenpruefung.control.wahlrecht.kriterium.AbstractWahlrechtGebietsartInReferenzGebietKriterium;
import de.ivu.elect.business.personenpruefung.control.wahlrecht.kriterium.HoechstalterAmStichtagKriterium;
import de.ivu.elect.business.personenpruefung.control.wahlrecht.kriterium.MindestalterAmStichtagKriterium;
import de.ivu.elect.business.personenpruefung.control.wahlrecht.kriterium.MindestaufenthaltAnAnschriftArtInGebietAmStichtagKriterium;
import de.ivu.elect.business.personenpruefung.control.wahlrecht.kriterium.PersonenregisterAbgleichbarkeitKriterium;
import de.ivu.elect.business.personenpruefung.control.wahlrecht.kriterium.WahlrechtsausschlussKriterium;

public class KandidaturWahlrechtMatcher extends AbstractPersonendatenWahlrechtMatcher {

  private static final long serialVersionUID = 1L;

  public KandidaturWahlrechtMatcher() {
    super();
  }

  @Override
  public List<MindestalterAmStichtagKriterium> collectMindestalterAmStichtagKriterien(Personendaten personendaten) {
    return asList(createMindestalterAmWahltagKriterium(personendaten, 18));
  }

  @Override
  public List<HoechstalterAmStichtagKriterium> collectHoechstalterAmStichtagKriterien(Personendaten personendaten) {
    return emptyList();
  }

  @Override
  public List<WahlrechtsausschlussKriterium> collectWahlrechtsausschlussKriterien(Personendaten personendaten) {
    return asList(new WahlrechtsausschlussKriterium(getDefaultPersonendatenClasses(), Wahlrechtsausschluss.KEIN_AUSSCHLUSS));
  }

  @Override
  public PersonenregisterAbgleichbarkeitKriterium collectPersonenregisterAbgleichbarkeitKriterium(Personendaten personendaten) {
    return new PersonenregisterAbgleichbarkeitKriterium(getDefaultPersonendatenClasses(),
        WahlrechtPersonenregisterAbgleichbarkeit.IRRELEVANT);
  }

  @Override
  public List<MindestaufenthaltAnAnschriftArtInGebietAmStichtagKriterium> collectMindestaufenthaltAnAnschriftArtInGebietAmStichtagKriterien(
      Personendaten personendaten) {
    return emptyList();
  }

  @Override
  public List< ? extends AbstractWahlrechtGebietsartInReferenzGebietKriterium> collectWahlrechtGebietsartInReferenzGebietKriterien(
      Personendaten personendaten) {
    return emptyList();
  }

  protected void requireKandidatur(Personendaten personendaten) {
    if (!personendaten.isInstanceOf(Kandidatur.class)) {
      throw new IllegalArgumentException("Personendaten muss Kandidatur sein [personendaten = " + personendaten + "]");
    }
  }
}
