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

import java.util.Arrays;

import javax.annotation.Nullable;

import de.ivu.elect.business.benutzerverwaltung.boundary.RolleExtendedDAO;

/**
 *  on 19.02.2016.
 */
public enum RolleTyp {

  FACHLICH {
    @Override
    public boolean equalsRolle(Rolle s, RolleExtendedDAO dao) {
      return s.isFachlicheRolle(dao);
    }

    @Override
    public boolean isPotentiellVomTyp(Rolle s, RolleExtendedDAO dao) {
      return equalsRolle(s, dao) && !s.getRecht().isEmpty();
    }

    @Override
    public boolean isFachlich() {
      return true;
    }
  },
  WAHL {
    @Override
    public boolean equalsRolle(Rolle s, RolleExtendedDAO dao) {
      return s.isWahlRolle(dao);
    }

    @Override
    public boolean isPotentiellVomTyp(Rolle s, RolleExtendedDAO dao) {
      return equalsRolle(s, dao);
    }
  },
  GEBIET {
    @Override
    public boolean equalsRolle(Rolle s, RolleExtendedDAO dao) {
      return s.isGebietRolle(dao);
    }

    @Override
    public boolean isPotentiellVomTyp(Rolle s, RolleExtendedDAO dao) {
      return equalsRolle(s, dao);
    }
  };

  public abstract boolean equalsRolle(Rolle s, RolleExtendedDAO dao);

  public abstract boolean isPotentiellVomTyp(Rolle s, RolleExtendedDAO dao);

  @Nullable
  public static RolleTyp valuePotentiell(Rolle rolle, RolleExtendedDAO dao) {
    return Arrays.stream(values())
        .filter(rolleTyp -> rolleTyp.isPotentiellVomTyp(rolle, dao))
        .findFirst().orElse(null);
  }

  public boolean isFachlich(){
    return false;
  }

}
