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

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

import de.ivu.elect.business.ergebnis.entity.Stimmenart;
import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.business.gruppe.entity.NlSystemGruppe;
import de.ivu.elect.business.gruppeimgebiet.entity.GruppeImGebiet;
import de.ivu.elect.business.stimmeingabe.control.StimmeingabeErfassenContext;
import de.ivu.elect.business.stimmeingabe.entity.NlDefaultListenwahlStimmeingabeGruppeStimmenErfassenModel;
import de.ivu.elect.business.stimmeingabe.entity.StimmeingabeGruppeStimmen;
import de.ivu.elect.business.stimmeingabe.entity.StimmeingabeGruppeStimmenErfassenModel;

public class NlDefaultListenwahlStimmeingabeGruppeStimmenModelBuilder extends AbstractListenwahlStimmeingabeGruppeStimmenModelBuilder {

  private static final long serialVersionUID = 1L;

  public NlDefaultListenwahlStimmeingabeGruppeStimmenModelBuilder() {
    super();
  }

  @Override
  protected StimmeingabeGruppeStimmenErfassenModel createStimmeingabeGruppeStimmenErfassenModel(Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet) {
    return new NlDefaultListenwahlStimmeingabeGruppeStimmenErfassenModel(wahldurchfuehrungsgebiet);
  }

  @Override
  protected void initializeModelStimmeingabeSystemGruppeStimmen(StimmeingabeGruppeStimmenErfassenModel result, GruppeImGebiet gruppeImGebiet, StimmeingabeErfassenContext context) {
    super.initializeModelStimmeingabeSystemGruppeStimmen(result, gruppeImGebiet, context);

    initializeModelStimmeingabeSystemGruppeStimmen((NlDefaultListenwahlStimmeingabeGruppeStimmenErfassenModel) result, context, gruppeImGebiet);
  }

  private void initializeModelStimmeingabeSystemGruppeStimmen(NlDefaultListenwahlStimmeingabeGruppeStimmenErfassenModel result, StimmeingabeErfassenContext context, GruppeImGebiet gruppeImGebiet) {
    for (NlSystemGruppe nlSystemGruppe : NlSystemGruppe.valuesBlanko()) {
      if (nlSystemGruppe.equalsSystemGruppe(gruppeImGebiet, getSystemGruppeEigenschaften())) {
        for (Stimmenart stimmenart : nlSystemGruppe.getStimmenarten()) {
          result.setStimmenSystemGruppe(nlSystemGruppe, stimmenart, createStimmeingabeGruppeStimmen(context, gruppeImGebiet, stimmenart));
        }
      }
    }
  }

  @Override
  public List<StimmeingabeGruppeStimmen> layoutModelStimmeingabeSystemGruppeStimmen(StimmeingabeGruppeStimmenErfassenModel model, StimmeingabeGruppeStimmenErfassenModelContext context) {
    // NOTE, dass die Stimmeingaben für die Systemgruppen "Gültige", "Ungültige", etc. im View zu den Kopfzahlen hinzugefügt werden!!!
    return getStimmeingabeGruppeStimmenErfassenModelLayout().layoutSystemGruppeStimmenKeine(model, context);
  }

  @Override
  public List<StimmeingabeGruppeStimmen> layoutModelStimmeingabePolitischeGruppeStimmen(StimmeingabeGruppeStimmenErfassenModel model, StimmeingabeGruppeStimmenErfassenModelContext context) {
    List<StimmeingabeGruppeStimmen> result = new ArrayList<>();

    result.addAll(model.getStimmenPolitischeGruppen());

    return result;
  }

  private StimmeingabeGruppeStimmen createStimmeingabeGruppeStimmen(StimmeingabeErfassenContext context, GruppeImGebiet gruppeImGebiet, Stimmenart stimmenart) {
    return createStimmeingabeGruppeStimmen(gruppeImGebiet, null, createStimmeingabeIfStimmenartApplicable(gruppeImGebiet, stimmenart, context), context);
  }
}
