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

import java.io.Serializable;
import java.util.Collection;

import de.ivu.elect.business.person.boundary.AbstractBerufDAO;
import de.ivu.elect.business.person.entity.Beruf;
import de.ivu.elect.business.person.entity.Personendaten;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wertelisten.boundary.AbstractWertelistenDAO;
import de.ivu.elect.business.wertelisten.entity.Wertelisten;
import de.ivu.elect.business.wertelisten.entity.WertelistenArt;


import static java.util.Arrays.asList;
import static java.util.Collections.emptyList;
import static java.util.Objects.isNull;
import static java.util.Objects.nonNull;

public class PersonendatenWertelistenAbgleichFinder implements Serializable {

  private static final long serialVersionUID = 1L;

  public Collection<Beruf> getBerufe(AbstractBerufDAO berufDao) {
    // NOTE, dass Berufe momentan nicht an einer Wahl oder Wahltermin hängen!
    return berufDao.findByAll();
  }

  public Collection<Wertelisten> getWertelisten(AbstractWertelistenDAO wertelistenDao, Personendaten personendaten) {
    return getWertelisten(wertelistenDao, personendaten, asList(WertelistenArt.values()));
  }

  public Collection<Wertelisten> getWertelisten(AbstractWertelistenDAO wertelistenDao, Personendaten personendaten,
      Collection<WertelistenArt> wertelistenArten) {
    Wahl wahl = personendaten.getWahl();

    if (isNull(wahl) && personendaten.hasGebiet()) {
      wahl = personendaten.getGebiet().getWahl();
    }

    if (nonNull(wahl)) {
      // NOTE ELECTDD-19, dass es Personendaten ohne direkte Wahl, bspw. Ansprechpartner eines Gebietes, gibt, die die
      // Prüfschritte einmalig durchlaufen und anschließend nicht mehr geprüft werden.
      return wertelistenDao.findByWahlAndWertelistenArt(wahl, wertelistenArten);
    }

    return emptyList();
  }
}
