
package de.ivu.elect.business.veranstaltung.control;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import javax.inject.Inject;

import de.ivu.elect.business.person.boundary.PersonendatenDAO;
import de.ivu.elect.business.veranstaltung.boundary.TeilnahmeDAO;
import de.ivu.elect.business.veranstaltung.entity.Teilnahme;

public class TeilnahmePersonendatenFinderFactory {

  @Inject
  private transient TeilnahmeImportAttacher teilnahmeImportAttacher;

  @Inject
  private transient PersonendatenDAO personendatenDAO;

  @Inject
  private transient TeilnahmeDAO teilnahmeDAO;

  public TeilnahmePersonendatenFinderFactory() {
    super();
  }

  public TeilnahmePersonendatenFinder createPersonendatenFinder(Collection<Teilnahme> teilnahmenInDatei, TeilnahmeExchangeContext context) {
    List<TeilnahmePersonendatenFinder> finderList = new ArrayList<>();

    addFinders(finderList, teilnahmenInDatei, context);

    return new CombinedTeilnahmePersonendatenFinder(finderList);
  }

  protected void addFinders(List<TeilnahmePersonendatenFinder> finderList, Collection<Teilnahme> teilnahmenInDatei, TeilnahmeExchangeContext context) {
    // HINT ELECTKOM-130: Wir nutzen verschiedene Strategien zum Auffinden einer Person.
    // NOTE, dass die Reihenfolge entscheidend ist! Die spezifischste Strategie sollte oben stehen.

    finderList.add(new TeilnahmePersonendatenPersistentFinder(context));
    finderList.add(new TeilnahmePersonendatenByInstanzFinder(context, teilnahmeImportAttacher));

    if (context.getWahltermin().isPersistent()) {
      // HINT: Ist der Wahltermin nicht persistent, können wir auch keine Personendaten am Wahltermin finden.
      // Die Personen müssen also direkt aus der Datei kommen, wofür der ByInstanz-Mechanismus oben gedacht ist.
      finderList.add(new TeilnahmePersonendatenByExterneIdFinder(teilnahmenInDatei, personendatenDAO, teilnahmeDAO, context.getWahltermin()));
    }
  }
}
