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;
import de.ivu.elect.sitzberechnung.konflikt.ErgebnisKonflikt;
import de.ivu.elect.sitzberechnung.konflikt.ErgebnisKonfliktArt;

import java.util.Collections;
import java.util.Set;

public abstract class AbstractSitzberechnungsalgorithmus implements Sitzberechnungsalgorithmus {

  @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);
  }

  @Override
  public Set<ErgebnisKonfliktArt> getErgebnisKonfliktArten() {
    return Collections.emptySet();
  }

  @Override
  public ErgebnisKonflikt ergebnisKonfliktFromJson(ErgebnisKonfliktArt ergebnisKonfliktArt, String json) {
    throw new UnsupportedOperationException(ergebnisKonfliktArt.name());
  }


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

}
