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

import java.util.Objects;
import java.util.function.Function;

import org.apache.commons.lang3.builder.HashCodeBuilder;

import de.ivu.elect.business.ergebnis.entity.Stimmenart;
import de.ivu.elect.business.gruppe.entity.SystemGruppe;

public class SystemGruppeMitStimmenartSchluessel {

  private final SystemGruppe systemGruppe;

  private final Stimmenart stimmenart;

  public SystemGruppeMitStimmenartSchluessel(SystemGruppe systemGruppe, Stimmenart stimmenart) {
    super();

    this.systemGruppe = systemGruppe;
    this.stimmenart = stimmenart;
  }

  @Override
  public int hashCode() {
    return new HashCodeBuilder(73, 27).append(systemGruppe).append(stimmenart).toHashCode();
  }

  @Override
  public boolean equals(Object other) {
    boolean result = super.equals(other);

    if (!result && other != null && this.getClass().isInstance(other)) {
      SystemGruppeMitStimmenartSchluessel otherSchluessel = (SystemGruppeMitStimmenartSchluessel) other;
      // HINT: auch gleich bei NULL-Werten
      result = Objects.equals(systemGruppe, otherSchluessel.systemGruppe) && Objects.equals(stimmenart, otherSchluessel.stimmenart);
    }

    return result;
  }

  public static <T> Function<T, SystemGruppeMitStimmenartSchluessel> createToSchluesselFunction(
      Function< ? super T, SystemGruppe> toSystemGruppe, Function< ? super T, Stimmenart> toStimmenart) {
    return new SystemGruppeMitStimmenartSchluesselFunction<T>(toSystemGruppe, toStimmenart);
  }

  public static class SystemGruppeMitStimmenartSchluesselFunction<T> implements Function<T, SystemGruppeMitStimmenartSchluessel> {

    private final Function< ? super T, SystemGruppe> toSystemGruppe;

    private final Function< ? super T, Stimmenart> toStimmenart;

    public SystemGruppeMitStimmenartSchluesselFunction(Function< ? super T, SystemGruppe> toSystemGruppe,
        Function< ? super T, Stimmenart> toStimmenart) {
      super();

      this.toSystemGruppe = toSystemGruppe;
      this.toStimmenart = toStimmenart;
    }

    @Override
    public SystemGruppeMitStimmenartSchluessel apply(T input) {
      return new SystemGruppeMitStimmenartSchluessel(toSystemGruppe.apply(input), toStimmenart.apply(input));
    }
  }
}
