
package de.ivu.elect.was.exchange.wahl;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import javax.inject.Inject;

import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.business.gruppe.entity.Gruppe;
import de.ivu.elect.business.gruppe.entity.SystemGruppe;
import de.ivu.elect.business.gruppeimgebiet.entity.GruppeImGebiet;
import de.ivu.elect.business.mandant.entity.Mandant;
import de.ivu.elect.business.sitzberechnung.control.OsvSitzberechnungsalgorithmusFinder;
import de.ivu.elect.business.wahl.boundary.WahlDAO;
import de.ivu.elect.business.wahl.control.NlWasWahlPostCreate;
import de.ivu.elect.business.wahl.entity.WahlImportContext;
import de.ivu.elect.business.wahl.entity.WahlParameter;
import de.ivu.elect.business.wahl.entity.Wahldurchfuehrung;
import de.ivu.elect.nl.eml.EmlWrapper;

public class WasEml110WahlImportMapper extends AbstractEml110WahlImportMapper<Wahldurchfuehrung, Wahldurchfuehrungsgebiet> implements WasWahlImportMapper {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient NlWasWahlPostCreate nlWasWahlPostCreate;

  @Inject
  private transient WahlDAO wahlDAO;

  @Inject
  private transient OsvSitzberechnungsalgorithmusFinder osvSitzberechnungsalgorithmusFinder;

  public WasEml110WahlImportMapper() {
    super();
  }

  @Override
  protected boolean isAlsWahldefinitionImportierenMoeglich() {
    return false; // Wahldefinition erfolgt in WUS
  }

  @Override
  protected void postWahlMapping(Wahldurchfuehrung wahl, EmlWrapper emlWrapper) {
    // erstmal setzen
    wahl.setSitzberechnungsalgorithmus(osvSitzberechnungsalgorithmusFinder.findeFuerWahlart(eml110Mapper.getElectionSubcategory(emlWrapper).name()));
  }

  @Override // ELECT-9761
  protected List<Gruppe> mappeGruppen(WahlImportContext context, EmlWrapper emlWrapper, Wahldurchfuehrung wahl, List<WahlParameter> wahlparameter) {
    List<Gruppe> gruppenAusDatei = Collections.emptyList();
    // ELECT-9943 List<Gruppe> gruppenAusDatei = super.mappeGruppen(context, emlWrapper, wahl, wahlparameter);

    List<Gruppe> result = new ArrayList<>(gruppenAusDatei);

    if (!nlWasWahlPostCreate.isCreateSystemgruppen()) {
      for (SystemGruppe systemGruppe : SystemGruppe.values()) {
        result.add(systemGruppeEigenschaften.createGruppeAusSystemGruppe(systemGruppe, wahl));
      }
    }

    return result;
  }

  @Override // ELECT-9761
  protected List<GruppeImGebiet> mappeGruppenImGebiet(List<Gebiet> gebiete, List<Gruppe> gruppen) {
    List<GruppeImGebiet> result = new ArrayList<>(super.mappeGruppenImGebiet(gebiete, gruppen));

    for (Gebiet gebiet : gebiete) {
      for (Gruppe gruppe : gruppen) {
        if (gruppe.isSystemGruppe()) {
          GruppeImGebiet gruppeImGebiet = gruppeImGebietFactory.create();
          gruppeImGebiet.setGruppe(gruppe);
          gruppeImGebiet.setGebiet(gebiet);

          result.add(gruppeImGebiet);
        }
      }
    }

    return result;
  }

  @Override
  public boolean isAcceptContext(WahlImportContext context) {
    return super.isAcceptContext(context) && !isWahlVorhanden(context.getMandant()) /*ELECT-9791*/;
  }

  private boolean isWahlVorhanden(Mandant mandant) {
    return !wahlDAO.findByAll(mandant).isEmpty();
  }
}
