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

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

import javax.annotation.Nullable;

import de.ivu.elect.business.ergebnis.entity.Stimmenart;
import de.ivu.elect.business.gruppeimgebiet.entity.GruppeImGebiet;
import de.ivu.elect.business.stimmeingabe.boundary.AbstractStimmeingabeGruppeStimmenModelBuilder;
import de.ivu.elect.business.stimmeingabe.boundary.StimmeingabeGruppeStimmenErfassenModelContext;
import de.ivu.elect.business.stimmeingabe.control.StimmeingabeErfassenContext;
import de.ivu.elect.business.stimmeingabe.entity.Stimmeingabe;
import de.ivu.elect.business.stimmeingabe.entity.StimmeingabeGruppeStimmen;
import de.ivu.elect.business.stimmeingabe.entity.StimmeingabeGruppeStimmenErfassenModel;
import de.ivu.elect.business.stimmeingabe.entity.StimmeingabeGruppeStimmenListenstimmenAbzuziehen;
import de.ivu.elect.business.stimmeingabe.entity.Stimmeingabefehler;

public class BtwStimmeingabeGruppeStimmenModelBuilder extends AbstractStimmeingabeGruppeStimmenModelBuilder {

  private static final long serialVersionUID = 1L;

  public BtwStimmeingabeGruppeStimmenModelBuilder() {
    super();
  }

  @Override
  public List<StimmeingabeGruppeStimmen> layoutModelStimmeingabeSystemGruppeStimmen(StimmeingabeGruppeStimmenErfassenModel model, StimmeingabeGruppeStimmenErfassenModelContext context) {
    return getStimmeingabeGruppeStimmenErfassenModelLayout().layoutSystemGruppeStimmenGueltigeUngueltigeConfiguredOrDefault(model, context,
        fallback -> fallback.layoutSystemGruppeStimmenKeine(model, context));
  }

  @Override
  public List<StimmeingabeGruppeStimmen> layoutModelStimmeingabePolitischeGruppeStimmen(StimmeingabeGruppeStimmenErfassenModel model, StimmeingabeGruppeStimmenErfassenModelContext context) {
    return getStimmeingabeGruppeStimmenErfassenModelLayout().layoutPolitischeGruppeStimmenMitSystemGruppeStimmenGueltigeUngueltigeConfiguredOrDefault(model, context,
        fallback -> fallback.layoutPolitischeGruppeStimmenMitSystemGruppeStimmenUngueltigeGueltigeAlsErsteZeilen(model, context));
  }

  @Override
  protected StimmeingabeGruppeStimmen createStimmeingabeGruppeStimmen(@Nullable Long stimmeingabeGruppeStimmenIndexOneBased, GruppeImGebiet gruppeImGebiet, StimmeingabeErfassenContext context) {
    StimmeingabeGruppeStimmen stimmeingabeGruppeStimmen = super.createStimmeingabeGruppeStimmen(stimmeingabeGruppeStimmenIndexOneBased, gruppeImGebiet, context);

    // ELECT-3908
    if (context.getWahldurchfuehrungsgebiet().getErfassungsbesonderheit().isAbzuziehendeListenstimmenErfassen()) {
      Stimmeingabe stimmeingabeListenstimmeAbzuziehen = null;
      List<Stimmeingabefehler> stimmeingabeListenstimmeAbzuziehenFehler = new ArrayList<>();

      if (!gruppeImGebiet.isSystemGruppe() && stimmeingabeGruppeStimmen.hasStimmeingabeListenstimme() || isSystemGruppeGueltige(gruppeImGebiet)) {
        stimmeingabeListenstimmeAbzuziehen = createStimmeingabeIfStimmenartApplicable(gruppeImGebiet, Stimmenart.LISTENSTIMME_ABZUZIEHEN, context);
        stimmeingabeListenstimmeAbzuziehenFehler = getStimmeingabefehlerLetzterErgebniseingang(stimmeingabeListenstimmeAbzuziehen, context);
      }

      return new StimmeingabeGruppeStimmenListenstimmenAbzuziehen(stimmeingabeGruppeStimmen, stimmeingabeListenstimmeAbzuziehen, stimmeingabeListenstimmeAbzuziehenFehler);
    }

    return stimmeingabeGruppeStimmen;
  }
}
