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

import static org.apache.commons.lang3.StringUtils.isBlank;
import static org.apache.commons.lang3.StringUtils.trimToEmpty;

import de.ivu.elect.business.benutzerverwaltung.entity.AbstractBenutzer;
import de.ivu.elect.business.system.entity.ElectSimplePrincipal;
import de.ivu.elect.jee.protokollierung.ProtokollThreadLocal;

public class ErgebniseingangErfasser {

  private static final ErgebniseingangErfasser SYSTEM = new ErgebniseingangErfasser(AbstractBenutzer.SYSTEM.getBenutzerkennung());

  private final String kennung;

  private ErgebniseingangErfasser(String kennung) {
    super();

    this.kennung = kennung;
  }

  public boolean isUnbekannt() {
    return isBlank(getKennung());
  }

  public String getKennung() {
    return kennung;
  }

  public static ErgebniseingangErfasser benutzerOrDefault() {
    return new ErgebniseingangErfasser(ProtokollThreadLocal.getBenutzerKennung()); // PrincipalMarker#getNameFuerProtokollierung || AbstractPrincipal#SYSTEM_BENUTZERKENNUNG
  }

  public static ErgebniseingangErfasser benutzer(ElectSimplePrincipal principal) {
    return new ErgebniseingangErfasser(principal == null ? "" : principal.getNameFuerProtokollierung());
  }

  public static ErgebniseingangErfasser benutzer(ErgebniseingangBase ergebniseingang) {
    return new ErgebniseingangErfasser(ergebniseingang == null ? "" : trimToEmpty(ergebniseingang.getErfasser()));
  }

  public static ErgebniseingangErfasser system() {
    return SYSTEM;
  }

  public static ErgebniseingangErfasser extern(String kennung) {
    return new ErgebniseingangErfasser(kennung);
  }

  @Override
  public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + (kennung == null ? 0 : kennung.hashCode());
    return result;
  }

  @Override
  public boolean equals(Object obj) {
    if (this == obj) {
      return true;
    }
    if (obj == null) {
      return false;
    }
    if (getClass() != obj.getClass()) {
      return false;
    }
    ErgebniseingangErfasser other = (ErgebniseingangErfasser) obj;
    if (kennung == null) {
      if (other.kennung != null) {
        return false;
      }
    } else if (!kennung.equals(other.kennung)) {
      return false;
    }
    return true;
  }
}
