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

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

public enum GebietSystemGebietsebene {

  /**
   * WERTE NICHT LÖSCHEN ODER UMBENNEN, WERDEN IN EXPORTEN VERWENDET(!)
   */
  OHNE{
    @Override
    public boolean isVorhanden() {
      return false;
    }

    @Override
    protected boolean isWurzelGebietsebeneInternal(SystemGebietsebene systemGebietsebene) {
      return false;
    }

    @Override
    public boolean isOhne() {
      return true;
    }
  },

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

    @Override
    public boolean isBund() {
      return true;
    }
  },

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

    @Override
    public boolean isBundesland() {
      return true;
    }
  },

  LANDKREIS {
    @Override
    protected boolean isWurzelGebietsebeneInternal(SystemGebietsebene systemGebietsebene) {
      return SystemGebietsebene.LANDKREIS.equals(systemGebietsebene);
    }

    @Override
    public boolean isLandkreis() {
      return true;
    }
  },

  VERBANDSGEMEINDE {
    @Override
    public boolean isGemeindeUebergeordnet() {
      return true;
    }

    @Override
    protected boolean isWurzelGebietsebeneInternal(SystemGebietsebene systemGebietsebene) {
      return SystemGebietsebene.VERBANDSGEMEINDE.equals(systemGebietsebene);
    }

    @Override
    public boolean isVerbandsgemeinde() {
      return true;
    }
  },

  GEMEINDE {
    @Override
    public boolean isGemeinde() {
      return true;
    }

    @Override
    public boolean isGemeindeUebergeordnet() {
      return false;
    }

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

  public boolean isVorhanden() {
    return true;
  }

  public boolean isGemeindeUebergeordnet() {
    return true;
  }

  public boolean isGemeinde() {
    return false;
  }

  public boolean isWurzelGebietsebene(SystemGebietsebene systemGebietsebene) {
    return systemGebietsebene != null && isWurzelGebietsebeneInternal(systemGebietsebene);

  }

  protected abstract boolean isWurzelGebietsebeneInternal(SystemGebietsebene systemGebietsebene);

  public boolean isOhne() {
    return false;
  }

  public boolean isBund() {
    return false;
  }

  public boolean isBundesland() {
    return false;
  }

  public boolean isLandkreis() {
    return false;
  }

  public boolean isVerbandsgemeinde() {
    return false;
  }
}
