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

import de.ivu.elect.business.gruppe.entity.EntityMitGruppe;
import de.ivu.elect.business.gruppe.entity.Gruppe;
import de.ivu.elect.jee.entity.Entity;

public enum PruefkriteriumGruppeArt {

  ALLE {
    @Override
    protected boolean isBezugZuGruppe(Gruppe gruppe) {
      return true;
    }
  },
  PARTEI {
    @Override
    protected boolean isBezugZuGruppe(Gruppe gruppe) {
      return gruppe.getGruppeArt().isPartei();
    }
  },
  WAEHLERGRUPPE_ORGANISIERT {
    @Override
    protected boolean isBezugZuGruppe(Gruppe gruppe) {
      return gruppe.getGruppeArt().isWaehlergruppe() && gruppe.getGruppeArt().isOrganisert();
    }
  },
  WAEHLERGRUPPE_NICHT_ORGANISIERT {
    @Override
    protected boolean isBezugZuGruppe(Gruppe gruppe) {
      return gruppe.getGruppeArt().isWaehlergruppe() && !gruppe.getGruppeArt().isOrganisert();
    }
  },
  VEREINIGUNG {
    @Override
    protected boolean isBezugZuGruppe(Gruppe gruppe) {
      return gruppe.getGruppeArt().isGruppenvereinigung();
    }
  },
  ORGANISIERT {
    @Override
    protected boolean isBezugZuGruppe(Gruppe gruppe) {
      return gruppe.getGruppeArt().isOrganisert();
    }
  },
  NICHT_ORGANISIERT {
    @Override
    protected boolean isBezugZuGruppe(Gruppe gruppe) {
      return !gruppe.getGruppeArt().isOrganisert();
    }
  };

  public boolean isBezugFuerEntity(Entity<?, ?> entity) {
    if (entity instanceof EntityMitGruppe) {
      if (((EntityMitGruppe<?>) entity).hasGruppe()) {
        return isBezugZuGruppe(((EntityMitGruppe<?>) entity).getGruppe());
      }
    }
    return false;
  }

  protected abstract boolean isBezugZuGruppe(Gruppe gruppe);
}
