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

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.control.StimmeingabeErfassenContext;
import de.ivu.elect.business.stimmeingabe.entity.Ergebniseingang;
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.StimmeingabeTK;

public abstract class AbstractStimmeingabeGruppeStimmenReadonlyModelBuilderLinkingListenkandidaturStimmenUnterseite extends AbstractListenwahlStimmeingabeGruppeStimmenModelBuilder {

  private static final long serialVersionUID = 1L;

  protected AbstractStimmeingabeGruppeStimmenReadonlyModelBuilderLinkingListenkandidaturStimmenUnterseite() {
    super();
  }

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

  @Override
  protected void initializeModelStimmeingabePolitischeGruppeStimmen(StimmeingabeGruppeStimmenErfassenModel result, @Nullable Long stimmeingabeGruppeStimmenIndexOneBased, GruppeImGebiet gruppeImGebiet, StimmeingabeErfassenContext context) {
    initializeModelStimmeingabePolitischeGruppeStimmenReadonly(result, stimmeingabeGruppeStimmenIndexOneBased, gruppeImGebiet, context);
  }

  @Override
  public List<StimmeingabeGruppeStimmen> layoutModelStimmeingabePolitischeGruppeStimmen(StimmeingabeGruppeStimmenErfassenModel model, StimmeingabeGruppeStimmenErfassenModelContext context) {
    // Cf. AbstractStimmeingabeGruppeStimmenReadonlyModelBuilderLinkingListenkandidaturStimmenUnterseite#layoutModelStimmeingabePolitischeGruppeStimmenReadonly!
    return getStimmeingabeGruppeStimmenErfassenModelLayout().layoutPolitischeGruppeStimmenKeine(model, context);
  }

  protected void initializeModelStimmeingabePolitischeGruppeStimmenReadonly(StimmeingabeGruppeStimmenErfassenModel result, @Nullable Long stimmeingabeGruppeStimmenIndexOneBased, GruppeImGebiet gruppeImGebiet, StimmeingabeErfassenContext context) {
    if (gruppeImGebiet.isPolitischeGruppe() && isStimmenartApplicable(gruppeImGebiet, Stimmenart.LISTENSTIMME, context)) {
      StimmeingabeGruppeStimmen stimmeingabeGruppeStimmen = createStimmeingabeGruppeStimmen(stimmeingabeGruppeStimmenIndexOneBased, gruppeImGebiet, null, createStimmeingabeTransient(context, gruppeImGebiet), context);

      if (stimmeingabeGruppeStimmen.hasStimmeingaben()) {
        result.getStimmenPolitischeGruppenReadonly().add(stimmeingabeGruppeStimmen);
      }
    }
  }

  public List<StimmeingabeGruppeStimmen> layoutModelStimmeingabePolitischeGruppeStimmenReadonly(StimmeingabeGruppeStimmenErfassenModel model, StimmeingabeGruppeStimmenErfassenModelContext context) {
    return model.getStimmenPolitischeGruppenReadonly();
  }

  private Stimmeingabe createStimmeingabeTransient(StimmeingabeErfassenContext context, GruppeImGebiet gruppeImGebiet) {
    Ergebniseingang ergebniseingang = new Ergebniseingang();
    ergebniseingang.setErgebniseingangsart(context.getErgebniseingangsart()); // ELECT-9205
    ergebniseingang.setErgebniseingangsherkunft(context.getErgebniseingangsherkunft());

    Stimmeingabe stimmeingabe = new Stimmeingabe();
    stimmeingabe.setGruppeImGebiet(gruppeImGebiet);
    stimmeingabe.setAnzahlEingabe(getAnzahlEingabeAusLetztemErgebniseingang(gruppeImGebiet, context));
    stimmeingabe.setStimmenart(Stimmenart.LISTENSTIMME);

    stimmeingabe.setErgebniseingangOhneUpdateBeziehung(ergebniseingang);

    return stimmeingabe;
  }

  private String getAnzahlEingabeAusLetztemErgebniseingang(GruppeImGebiet gruppeImGebiet, StimmeingabeErfassenContext context) {
    Stimmeingabe stimmeingabe = context.getLetzterErgebniseingangAktuellStimmeingabenPerTk().get(new StimmeingabeTK(Stimmenart.LISTENSTIMME, gruppeImGebiet.getGruppeImGebietTK(), null, null));

    if (stimmeingabe != null) {
      return stimmeingabe.getAnzahlEingabe();
    }

    return null;
  }
}
