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

import java.util.Collection;

import de.ivu.elect.business.system.entity.SystemGebietsebene;

public enum WahlartSystemGebietsebene {

  /**
   * WERTE NICHT LÖSCHEN ODER UMBENNEN, WERDEN IN EXPORTEN VERWENDET(!)
   */

  OHNE {
    @Override
    protected boolean akzeptiertInternal(SystemGebietsebene systemGebietsebene) {
      return true;
    }
  },

  BUND {
    @Override
    protected boolean akzeptiertInternal(SystemGebietsebene systemGebietsebene) {
      return SystemGebietsebene.BUND.equals(systemGebietsebene);
    }
  },

  BUNDESLAND {
    @Override
    protected boolean akzeptiertInternal(SystemGebietsebene systemGebietsebene) {
      return SystemGebietsebene.BUNDESLAND.equals(systemGebietsebene);
    }
  },

  @Deprecated
  LANDKREIS {
    @Override
    protected boolean akzeptiertInternal(SystemGebietsebene systemGebietsebene) {
      return SystemGebietsebene.LANDKREIS.equals(systemGebietsebene)
          || SystemGebietsebene.GEMEINDE_KREISFREI.equals(systemGebietsebene) /*ELECTKOM-1707*/
          ;
      /* ELECT-15057 || SystemGebietsebene.VERBANDSGEMEINDE.equals(systemGebietsebene) /*ELECTKOM-1707;*/
    }
  },

  LANDKREIS_AUSSCHLIESSLICH {
    @Override
    protected boolean akzeptiertInternal(SystemGebietsebene systemGebietsebene) {
      return SystemGebietsebene.LANDKREIS.equals(systemGebietsebene);
    }
  },

  GEMEINDE_KREISFREI /*ELECT-15134*/ {
    @Override
    protected boolean akzeptiertInternal(SystemGebietsebene systemGebietsebene) {
      return SystemGebietsebene.GEMEINDE_KREISFREI.equals(systemGebietsebene);
    }
  },
  VERBANDSGEMEINDE {
    @Override
    protected boolean akzeptiertInternal(SystemGebietsebene systemGebietsebene) {
      return SystemGebietsebene.VERBANDSGEMEINDE.equals(systemGebietsebene);
    }
  },

  @Deprecated
  GEMEINDE {
    @Override
    protected boolean akzeptiertInternal(SystemGebietsebene systemGebietsebene) {
      return SystemGebietsebene.GEMEINDE.equals(systemGebietsebene)
          || SystemGebietsebene.GEMEINDE_KREISFREI.equals(systemGebietsebene) /*ELECT-9043*/
          ;
      /* ELECT-15057 || SystemGebietsebene.VERBANDSGEMEINDE.equals(systemGebietsebene) /*ELECTKOM-1733; */
    }
  },

  GEMEINDE_AUSSCHLIESSLICH {
    @Override
    protected boolean akzeptiertInternal(SystemGebietsebene systemGebietsebene) {
      return SystemGebietsebene.GEMEINDE.equals(systemGebietsebene);
    }
  };

  public boolean akzeptiert(SystemGebietsebene systemGebietsebene) {
    return systemGebietsebene == null || !systemGebietsebene.isZuBeachten() || akzeptiertInternal(systemGebietsebene);

  }

  protected abstract boolean akzeptiertInternal(SystemGebietsebene systemGebietsebene);

  public static WahlartSystemGebietsebene valueOfFallback(String name) {
    try {
      return WahlartSystemGebietsebene.valueOf(name);
    } catch (Exception e) {
      return OHNE;
    }
  }

  public static boolean akzeptiert(Collection<WahlartSystemGebietsebene> wahlartSystemGebietsebenen, SystemGebietsebene systemGebietsebene) {
    return wahlartSystemGebietsebenen.stream().anyMatch(wahlartSystemGebietsebene -> wahlartSystemGebietsebene.akzeptiert(systemGebietsebene));
  }

}
