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

import java.util.Comparator;
import java.util.function.Function;

import de.ivu.elect.jee.faces.Messages;
import de.ivu.elect.util.NullComparator;

public class NiederschriftByGebietNummerAndNiederschriftArtComparator implements Comparator<Niederschrift> {

  private static final Comparator<Object> NULL_COMPARATOR = NullComparator.NULL_BEFORE_NON_NULL_COMPARATOR;

  private static final NiederschriftByGebietNummerComparator NIEDERSCHRIFT_BY_GEBIET_NUMMER_COMPARATOR = new NiederschriftByGebietNummerComparator();

  private final Function<NiederschriftArt, String> niederschriftArtFormatter;

  public NiederschriftByGebietNummerAndNiederschriftArtComparator(Messages messages) {
    this(messages::lokalisiere);
  }

  public NiederschriftByGebietNummerAndNiederschriftArtComparator(Function<NiederschriftArt, String> niederschriftArtFormatter) {
    super();

    this.niederschriftArtFormatter = niederschriftArtFormatter;
  }

  @Override
  public int compare(Niederschrift one, Niederschrift another) {
    if (one == null || another == null) {
      return NULL_COMPARATOR.compare(one, another);
    }

    int comparedByGebietNummer = compareByGebietNummer(one, another);

    if (comparedByGebietNummer == 0) {
      return compareByNiederschriftArt(one, another);
    }

    return comparedByGebietNummer;
  }

  private int compareByGebietNummer(Niederschrift one, Niederschrift another) {
    return NIEDERSCHRIFT_BY_GEBIET_NUMMER_COMPARATOR.compare(one, another);
  }

  private int compareByNiederschriftArt(Niederschrift one, Niederschrift another) {
    if (one.getNiederschriftArt() == null || another.getNiederschriftArt() == null) {
      return NULL_COMPARATOR.compare(one.getNiederschriftArt(), another.getNiederschriftArt());
    }

    return formatNiederschriftArt(one).compareTo(formatNiederschriftArt(another));
  }

  private String formatNiederschriftArt(Niederschrift niederschrift) {
    return niederschriftArtFormatter.apply(niederschrift.getNiederschriftArt());
  }
}
