
package de.ivu.elect.business.ergebniskonflikt.entity;

import java.util.Collection;

import javax.annotation.Nullable;

import de.ivu.elect.business.ergebnis.entity.Ergebnis;
import de.ivu.elect.business.ergebnis.entity.ErgebnisKonfliktStatus;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.kandidatur.entity.Kandidatur;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahlvorschlag.entity.Liste;
import de.ivu.elect.business.wahlvorschlag.entity.Listenverbindung;

public abstract class AbstractErgebnisKonflikt implements ErgebnisKonfliktBase {

  private static final long serialVersionUID = 1L;

  public static final String LOESUNG_AUS_VARIANTENBERECHNUNG = "VARIANTENBERECHNUNG";

  public AbstractErgebnisKonflikt() {
    super();
  }

  public boolean isGeloest() {
    return getErgebnisKonfliktStatus().isGeloest();
  }

  @Nullable
  public Wahl getWahl() {
    Ergebnis ergebnis = getErgebnis();

    if (ergebnis != null) {
      return ergebnis.getWahl();
    }

    return null;
  }

  /**
   * Prüft ob die beiden Konflikte die gleiche zu entscheidene Situation beschreiben. Nicht betrachtet werden hier die Attribute, die die Lösung / Auswahl / Entscheidung betreffen.
   * <p/>
   * Fachlicher gleicher Konflikt <=> Gleiche ErgebnisKonfliktArt und CustomData gleich
   */
  public boolean isFachlichGleicherKonflikt(ErgebnisKonflikt other) {
    return getErgebnisKonfliktArt().equals(other.getErgebnisKonfliktArt()) && getCustomData(ErgebnisKonfliktCustomData.class).isFachlichGleich(other.getCustomData(ErgebnisKonfliktCustomData.class));
  }

  // TODO irgendwann mal direkt im Datenmodell an Gebiet hängen...
  public Gebiet getGebiet(Collection<Kandidatur> alleKandidaturen, Collection<Liste> alleListen, Collection<Listenverbindung> alleListenverbindungen) {
    return getCustomData(ErgebnisKonfliktCustomData.class).getGebiet(alleKandidaturen, alleListen, alleListenverbindungen);
  }

  public boolean isLoesungAusVariantenberechnung() {
    return ErgebnisKonfliktStatus.SYSTEM_ENTSCHIEDEN.equals(getErgebnisKonfliktStatus()) && LOESUNG_AUS_VARIANTENBERECHNUNG.equals(getLoesungVon());
  }

  public ErgebnisKonflikt cloneOhneLoesung() {
    // Neue Instanz mit geclontem Cusom Data erzeugen
    ErgebnisKonflikt result = new ErgebnisKonflikt(new ErgebnisKonfliktEmptyCustomData());
    result.setCustomDataXml(this.getCustomDataStorage().getCustomDataXml());
    result.getCustomDataStorage().clearCustomDataCache();

    // Sonstige Attribute kopieren (außer mit Bezug zur Lösung)
    result.setErgebnis(getErgebnis());
    result.setErgebnisKonfliktArt(getErgebnisKonfliktArt());
    result.setKonfliktBeschreibung(getKonfliktBeschreibung());

    result.setErgebnisKonfliktStatus(ErgebnisKonfliktStatus.UNGELOEST);

    return result;
  }
}
