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

import de.ivu.elect.sitzberechnung.SitzberechnungEntity;
import de.ivu.elect.sitzberechnung.konflikt.AbstractErgebnisKonflikt;
import de.ivu.elect.sitzberechnung.konflikt.ErgebnisKonflikt;
import de.ivu.elect.sitzberechnung.konflikt.ErgebnisKonfliktArt;
import de.ivu.elect.sitzberechnung.konflikt.ErgebnisKonfliktStatus;

import java.util.List;

public class OSVLegacyKonflikt extends AbstractErgebnisKonflikt {

  private final OSVLegacyKonfliktType osvLegacyKonfliktType;
  private final List<SitzberechnungEntity> entitaetenZurAuswahl;
  private SitzberechnungEntity geloesteEntitaet = null;


  public static OSVLegacyKonflikt createUngeloestenOSVLegacyKonflikt(long position, List<SitzberechnungEntity> entitaetenZurAuswahl, OSVLegacyKonfliktType osvLegacyKonfliktType) {
    return new OSVLegacyKonflikt(position, ErgebnisKonfliktStatus.UNGELOEST, entitaetenZurAuswahl, osvLegacyKonfliktType);
  }

  public static OSVLegacyKonflikt createGelostenOSVLegacyKonflikt(OSVLegacyKonflikt ungeloesterKonflikt, SitzberechnungEntity geloesteEntitaet) {
    return new OSVLegacyKonflikt(ErgebnisKonfliktStatus.MANUELL_ENTSCHIEDEN, ungeloesterKonflikt, geloesteEntitaet);
  }

  private OSVLegacyKonflikt(long position, ErgebnisKonfliktStatus ergebnisKonfliktStatus, List<SitzberechnungEntity> entitatenZurAuswahl, OSVLegacyKonfliktType osvLegacyKonfliktType) {
    super(ergebnisKonfliktStatus, position);
    this.osvLegacyKonfliktType = osvLegacyKonfliktType;
    this.entitaetenZurAuswahl = entitatenZurAuswahl;
  }


  private OSVLegacyKonflikt(ErgebnisKonfliktStatus ergebnisKonfliktStatus, OSVLegacyKonflikt otherKonflikt) {
    super(ergebnisKonfliktStatus, otherKonflikt.getPosition());
    this.entitaetenZurAuswahl = otherKonflikt.entitaetenZurAuswahl;
    this.osvLegacyKonfliktType = otherKonflikt.osvLegacyKonfliktType;
  }


  private OSVLegacyKonflikt(ErgebnisKonfliktStatus ergebnisKonfliktStatus, OSVLegacyKonflikt otherKonflikt, SitzberechnungEntity geloesteEntitaet) {
    this(ergebnisKonfliktStatus, otherKonflikt);
    this.geloesteEntitaet = geloesteEntitaet;
    if (!entitaetenZurAuswahl.contains(geloesteEntitaet)) {
      throw new IllegalStateException("Die gelöste Entität gehört nicht zur Auswahl: " + geloesteEntitaet);
    }
  }


  public OSVLegacyKonfliktType getOSVLegacyKonfliktType() {
    return osvLegacyKonfliktType;
  }

  @Override
  public ErgebnisKonfliktArt getErgebnisKonfliktArt() {
    return null;
  }

  @Override
  public boolean isFachlichGleich(ErgebnisKonflikt other) {
    if (!(other instanceof OSVLegacyKonflikt)) {
      return false;
    }

    OSVLegacyKonflikt otherOSVKonflikt = (OSVLegacyKonflikt) other;

    return otherOSVKonflikt.getPosition()== getPosition()/*workaround für ELECT-10627*/
            && otherOSVKonflikt.getOSVLegacyKonfliktType().equals(osvLegacyKonfliktType)
            && otherOSVKonflikt.getEntitaetenZurAuswahl().size() == getEntitaetenZurAuswahl().size()
            && otherOSVKonflikt.getEntitaetenZurAuswahl().containsAll(getEntitaetenZurAuswahl());
  }

  @Override
  public String toString() {
    String geloesterString = getGeloesteEntitaet() == null ? "Keine geloste Entität vorhanden" : getGeloesteEntitaet().getKey();
    return "OSVLegacyKonflikt{" +
            " \n entitaetenZurAuswahl=" + entitaetenZurAuswahl +
            ", \n konfliktArtOSV=" + osvLegacyKonfliktType +
            ", \n geloste=" + geloesterString +
            ", \n position=" + getPosition() +
            '}';
  }

  @Override
  public String toJson() {
    //todo
    return null;
  }


  public List<SitzberechnungEntity> getEntitaetenZurAuswahl() {
    return entitaetenZurAuswahl;
  }

  public SitzberechnungEntity getGeloesteEntitaet() {
    return geloesteEntitaet;
  }
}
