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

import java.util.Date;
import java.util.List;

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;
import de.ivu.elect.business.wahlvorschlagsperson.entity.WahlvorschlagsPerson;


import static de.ivu.elect.jee.entity.EntityUtil.castTo;
import static java.util.Arrays.asList;
import static java.util.Collections.emptyList;
import static java.util.Objects.isNull;

public class WahlvorschlagsPersonWahlrechtMatcher extends AbstractPersonendatenWahlrechtMatcher {

  private static final long serialVersionUID = 1L;

  public WahlvorschlagsPersonWahlrechtMatcher() {
    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 Date getTagDerUnterschrift(Personendaten personendaten) {
    requireWahlvorschlagsPerson(personendaten);

    WahlvorschlagsPerson wahlvorschlagsPerson = castTo(personendaten, WahlvorschlagsPerson.class);

    if (isNull(wahlvorschlagsPerson.getDatumUnterschrift())) {
      wahlvorschlagsPerson.setDatumUnterschrift(new Date());
    }

    return wahlvorschlagsPerson.getDatumUnterschrift();
  }

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