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

import java.io.Serializable;
import java.util.function.Consumer;

import javax.annotation.Nonnull;

public class BackgroundServiceStatus implements Serializable, Comparable<BackgroundServiceStatus> {

  private static final long serialVersionUID = 1L;

  private final SystemLogQuelle systemLogQuelle;

  private final boolean laeuftGerade;

  private final long runningCount;

  private final boolean deaktiviert;

  private final long anzahlTodoCheck;

  private final long anzahlAufrufe;

  private final long anzahlFehler;

  private final long zeitInMsInsgesamt;

  private final Consumer<Boolean> disableToggle;

  private final long anzahlParalleleAufrufe;

  private final long anzahlSlots;

  public BackgroundServiceStatus(SystemLogQuelle systemLogQuelle,
                                 boolean laeuftGerade,
                                 long runningCount,
                                 boolean deaktiviert,
                                 long anzahlTodoCheck,
                                 long anzahlAufrufe,
                                 long anzahlFehler,
                                 long zeitInMsInsgesamt,
                                 Consumer<Boolean> disableToggle,
                                 long anzahlParalleleAufrufe,
                                 long anzahlSlots) {
    this.systemLogQuelle = systemLogQuelle;
    this.laeuftGerade = laeuftGerade;
    this.runningCount = runningCount;
    this.deaktiviert = deaktiviert;
    this.anzahlTodoCheck = anzahlTodoCheck;
    this.anzahlAufrufe = anzahlAufrufe;
    this.anzahlFehler = anzahlFehler;
    this.zeitInMsInsgesamt = zeitInMsInsgesamt;
    this.disableToggle = disableToggle;
    this.anzahlParalleleAufrufe = anzahlParalleleAufrufe;
    this.anzahlSlots = anzahlSlots;
  }

  public SystemLogQuelle getSystemLogQuelle() {
    return systemLogQuelle;
  }

  public boolean isLaeuftGerade() {
    return laeuftGerade;
  }

  public boolean isDeaktiviert() {
    return deaktiviert;
  }

  public boolean isAktiviert() {
    return !isDeaktiviert();
  }

  public long getAnzahlAufrufe() {
    return anzahlAufrufe;
  }

  public long getZeitInMsInsgesamt() {
    return zeitInMsInsgesamt;
  }

  public long getAnzahlFehler() {
    return anzahlFehler;
  }

  public long getAnzahlTodoCheck() {
    return anzahlTodoCheck;
  }

  public long getAnzahlParalleleAufrufe() {
    return anzahlParalleleAufrufe;
  }

  public long getAnzahlSlots() {
    return anzahlSlots;
  }

  @Override
  public int compareTo(@Nonnull BackgroundServiceStatus other) {
    return this.getSystemLogQuelle().compareTo(other.getSystemLogQuelle());
  }

  public Long getId() {
    return (long) getSystemLogQuelle().ordinal();
  }

  @Override
  public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;

    var that = (BackgroundServiceStatus) o;

    return systemLogQuelle == that.systemLogQuelle;

  }

  @Override
  public int hashCode() {
    return systemLogQuelle.hashCode();
  }

  public Consumer<Boolean> getDisableToggle() {
    return disableToggle;
  }

  public long getRunningCount() {
    return runningCount;
  }
}
