
package de.ivu.elect.business.stimmeingabe.boundary.plausi;

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

import javax.ejb.Stateless;
import javax.enterprise.inject.Specializes;
import javax.inject.Inject;

import de.ivu.elect.business.stimmeingabe.boundary.StimmeingabePlausiKonfigurationDAO;
import de.ivu.elect.business.stimmeingabe.boundary.StimmeingabePlausiKonfigurationFactory;
import de.ivu.elect.business.stimmeingabe.control.StimmeingabeKopfzahlKonfiguration;
import de.ivu.elect.business.stimmeingabe.control.StimmeingabePlausiKonfigurationCreate;
import de.ivu.elect.business.stimmeingabe.control.plausi.StimmeingabePlausiDefinitions;
import de.ivu.elect.business.stimmeingabe.control.plausi.StimmeingabePlausiDefinitionsContext;
import de.ivu.elect.business.stimmeingabe.entity.StimmeingabePlausiKonfiguration;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahl.entity.WahlParameterLoader;

@Specializes
@Stateless
public class WasDefaultStimmeingabePlausiKonfigurationCreator extends DefaultStimmeingabePlausiKonfigurationCreator {

  @Inject
  private transient WahlParameterLoader wahlParameterLoader;

  @Inject
  private transient StimmeingabePlausiKonfigurationDAO stimmeingabePlausiKonfigurationDAO;

  @Inject
  private transient StimmeingabePlausiKonfigurationFactory stimmeingabePlausiKonfigurationFactory;

  @Inject
  private transient StimmeingabePlausiKonfigurationCreate stimmeingabePlausiKonfigurationCreate;

  @Inject
  private transient StimmeingabePlausiDefinitionsResolver stimmeingabePlausiDefinitionsResolver;

  @Inject
  private transient StimmeingabeKopfzahlKonfiguration stimmeingabeKopfzahlKonfiguration;

  public WasDefaultStimmeingabePlausiKonfigurationCreator() {
    super();
  }

  @Override
  public List<StimmeingabePlausiKonfiguration> initDefaultStimmeingabePlausiKonfigurationen(Wahl wahl) {
    List<StimmeingabePlausiKonfiguration> neuePlausiKonfigurationen = new ArrayList<>();

    Optional<StimmeingabePlausiDefinitions> stimmeingabePlausiDefinitions = stimmeingabePlausiDefinitionsResolver.findStimmeingabePlausiDefinitions(wahl);

    if (stimmeingabePlausiDefinitions.isPresent()) {
      for (StimmeingabePlausiKonfiguration stimmeingabePlausiKonfiguration : collectStimmeingabePlausiKonfigurationDefiniert(wahl, stimmeingabePlausiDefinitions.get())) {
        if (!stimmeingabePlausiKonfiguration.isPersistent()) {
          StimmeingabePlausiKonfiguration neuePlausiKonfiguration = stimmeingabePlausiKonfigurationFactory.create();
          stimmeingabePlausiKonfiguration.copyTo(neuePlausiKonfiguration);

          stimmeingabePlausiKonfigurationCreate.save(neuePlausiKonfiguration);

          neuePlausiKonfigurationen.add(neuePlausiKonfiguration);
        }
      }
    }

    return neuePlausiKonfigurationen;
  }

  // ELECT-8075
  private Collection<StimmeingabePlausiKonfiguration> collectStimmeingabePlausiKonfigurationDefiniert(Wahl wahl, StimmeingabePlausiDefinitions stimmeingabePlausiDefinitions) {
    return stimmeingabePlausiDefinitions.collectStimmeingabePlausiKonfigurationDefiniert(new StimmeingabePlausiDefinitionsContext(stimmeingabePlausiKonfigurationDAO, wahlParameterLoader),
        stimmeingabeKopfzahlKonfiguration, wahl);
  }
}
