
package de.ivu.elect.sitzberechnung.control;

import de.ivu.elect.sitzberechnung.Gebiet;
import de.ivu.elect.sitzberechnung.Sitzberechnungsalgorithmus;
import de.ivu.elect.sitzberechnung.Sitzberechnungseingabe;
import de.ivu.elect.sitzberechnung.Sitzberechnungsergebnis;
import de.ivu.elect.sitzberechnung.entity.DefaultSitzberechnungsergebnis;

public abstract class AbstractSitzberechnungsalgorithmus implements Sitzberechnungsalgorithmus {

  protected AbstractSitzberechnungsalgorithmus() {
    super();
  }

  @Override
  public Sitzberechnungsergebnis berechneSitzverteilung(Sitzberechnungseingabe eingabe) {
    Sitzberechnungsdaten sitzberechnungsdaten = new Sitzberechnungsdaten(eingabe);

    validateSitzberechnugsdaten(sitzberechnungsdaten);

    DefaultSitzberechnungsergebnis sitzberechnungsergebnis = new DefaultSitzberechnungsergebnis(sitzberechnungsdaten);
    berechneSitzverteilung(sitzberechnungsdaten, sitzberechnungsergebnis);

    return sitzberechnungsergebnis;
  }

  protected abstract void berechneSitzverteilung(Sitzberechnungsdaten sitzberechnungsdaten, DefaultSitzberechnungsergebnis sitzberechnungsergebnis);

  protected String getName(Sitzberechnungsdaten sitzberechnungsdaten, Gebiet gebiet) {
    return sitzberechnungsdaten.getSitzberechnungeingabe().getSitzberechnungLokalisierung().getName(gebiet);
  }

  public void validateSitzberechnugsdaten(Sitzberechnungsdaten sitzberechnungsdaten) {
    sitzberechnungsdaten.validate();
  }
}
