package de.ivu.elect.sitzberechnung.osv.exchange.control;

import de.ivu.elect.sitzberechnung.control.AbstractSitzberechnungsalgorithmus;
import de.ivu.elect.sitzberechnung.control.Sitzberechnungsdaten;
import de.ivu.elect.sitzberechnung.entity.DefaultSitzberechnungsergebnis;
import de.ivu.elect.sitzberechnung.konflikt.ErgebnisKonflikt;
import de.ivu.elect.sitzberechnung.konflikt.ErgebnisKonfliktArt;
import de.ivu.elect.sitzberechnung.osv.exchange.OSVLegacySitzberechnungseingabe;
import de.ivu.wahl.result.determination.ElectionResultDeterminator;
import de.ivu.wahl.result.result.ElectionResult;

import java.util.Set;

public class OSVLegacySitzberechnung extends AbstractSitzberechnungsalgorithmus {

  private final OSVLegacySitzberechnungseingabe osveingabedaten;

  public OSVLegacySitzberechnung(OSVLegacySitzberechnungseingabe osveingabedaten) {
    this.osveingabedaten = osveingabedaten;
  }

  @Override
  protected void berechneSitzverteilung(Sitzberechnungsdaten sitzberechnungsdaten, DefaultSitzberechnungsergebnis sitzberechnungsergebnis) {
    ElectInterfacesOSVLegacyMapper mapper = new ElectInterfacesOSVLegacyMapper(getOSVSitzberechungsdaten(sitzberechnungsdaten));

    //OSV Berechnung
    ElectionResult electionResultDetails = ElectionResultDeterminator.determineElectionResult(
            mapper.mapLosentscheide(), mapper.getOSVEingabedaten());

    //Ergebnismapping
    mapper.mapErgebnisse(electionResultDetails, sitzberechnungsergebnis);
  }

  @Override
  public Set<ErgebnisKonfliktArt> getErgebnisKonfliktArten() {
    return null; //todo
  }

  @Override
  public ErgebnisKonflikt ergebnisKonfliktFromJson(ErgebnisKonfliktArt ergebnisKonfliktArt, String json) {
    return null;
  }

  @Override
  public void validateSitzberechnugsdaten(Sitzberechnungsdaten daten) {
    super.validateSitzberechnugsdaten(daten);
    getOSVSitzberechungsdaten(daten).validate();
  }

  private OSVLegacySitzberechnungsdaten getOSVSitzberechungsdaten(Sitzberechnungsdaten sitzberechnungsdaten) {
    return new OSVLegacySitzberechnungsdaten(osveingabedaten, sitzberechnungsdaten);
  }
}
