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

import java.util.Collection;

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.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 boolean isGeloest() {
    return getErgebnisKonfliktStatus().isGeloest();
  }

  /**
   * 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;
  }
}
