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

import java.util.Arrays;

import de.ivu.elect.jee.exception.ElectCommonException;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public enum NlWvpStaat {
  UNBEKANNT("", false) {
    @Override
    public boolean isBekannt() {
      return false;
    }
  },
  AFGHANISTAN("AF", false),
  AEGYPTEN("EG", false),
  ALBANIEN("AL", false),
  ALGERIEN("DZ", false),
  ANDORRA("AD", false),
  ANGOLA("AO", false),
  ANTIGUA("AG", false),
  AEQUATORIALGUINEA("GQ", false),
  ARGENTINIEN("AR", false),
  ARMENIEN("AM", false),
  ASERBAIDSCHAN("AZ", false),
  AETHIOPIEN("ET", false),
  AUSTRALIEN("AU", false),
  ASCENSION("AC", false),
  ANGUILLA("AI", false),
  ANTARKTIKA("AQ", false),
  AMERIKANISCH_SAMOA("AS", false),
  AMERIKANISCHE_JUNGFERNINSELN("VI", false),
  ARUBA("AW", false),
  ALAND("AX", false),
  BAHAMAS("BS", false),
  BAHRAIN("BH", false),
  BANGLADESCH("BD", false),
  BARBADOS("BB", false),
  BELGIEN("BE", true),
  BELIZE("BZ", false),
  BENIN("BJ", false),
  BERMUDA("BM", false),
  BHUTAN("BT", false),
  BOLIVIEN("BO", false),
  BOSNIEN_HERZEGOWINA("BA", false),
  BOTSUANA("BW", false),
  BOUVETINSEL("BV", false),
  BRASILIEN("BR", false),
  BRITISCHE_JUNGFERNINSELN("VG", false),
  BRITISCHES_TERRITORIUM_INDISCHER_OZEAN("IO", false),
  BRUNEI("BN", false),
  BULGARIEN("BG", true),
  BURKINA_FASO("BF", false),
  BURUNDI("BI", false),
  CHILE("CL", false),
  CHINA("CN", false),
  CLIPPERTON("CP", false),
  COOKINSELN("CK", false),
  COSTA_RICA("CR", false),
  COTE_DLVOIRE("CI", false),
  CURACAO("CW", false),
  DAENEMARK("DK", true),
  DEUTSCHLAND("DE", true) {
    @Override
    public boolean isDeutschland() {
      return true;
    }
  },
  DOMINICA("DM", false),
  DOMINIKANISCHE_REPUBLIK("DO", false),
  DSCHIBUTI("DJ", false),
  ECUADOR("EC", false),
  EL_SALVADOR("SV", false),
  ERITREA("ER", false),
  ESTLAND("EE", true),
  FALKLAND_INSELN("FK", false),
  FAEROEER("FO", false),
  FIDSCHI("FJ", false),
  FINNLAND("FI", true),
  FRANKREICH("FR", true),
  FRANZOESISCH_GUAYANA("GF", false),
  FRANZOESISCH_POLYNESIEN("PF", false),
  FRANZOESISCHE_ANTARKTISGEBIETE("TF", false),
  GABUN("GA", false),
  GAMBIA("GM", false),
  GEORGIEN("GE", false),
  GHANA("GH", false),
  GIBRALTAR("GI", false),
  GRENADA("GD", false),
  GRIECHENLAND("GR", true),
  GROENLAND("GL", false),
  GUADELOUPE("GP", false),
  GUAM("GU", false),
  GUATEMALA("GT", false),
  GUERNSEY("GG", false),
  GUINEA("GN", false),
  GUINEA_BISSAU("GW", false),
  GGUYANA("GY", false),
  HAITI("HT", false),
  HEARD("HM", false),
  HONDURAS("HN", false),
  HONGKONG("HK", false),
  INDIEN("IN", false),
  INDONESIEN("ID", false),
  INTERNATIONALES_GEBIET("ZZ", false), //ELECTVAPP-717 "ZZ" von uns ausgedacht
  IRAK("IQ", false),
  IRAN("IR", false),
  IRLAND("IE", true),
  ISLAND("IS", false),
  ISLE_OF_MAN("IM", false),
  ISRAEL("IL", false),
  ITALIEN("IT", true),
  JAMAIKA("JM", false),
  JAPAN("JP", false),
  JEMEN("YE", false),
  JERSEY("JE", false),
  JORDANIEN("JO", false),
  KAIMANINSELN("KY", false),
  KAMBODSCHA("KH", false),
  KAMERUN("CM", false),
  KANADA("CA", false),
  KANARISCHE_INSELN("IC", false),
  KAP_VERDE("CV", false),
  KASACHSTAN("KZ", false),
  KATAR("QA", false),
  KENIA("KE", false),
  KIRGISISTAN("KG", false),
  KIRIBATI("KI", false),
  KOKOSINSELN("CC", false),
  KOLUMBIEN("CO", false),
  KOMOREN("KM", false),
  KONGO("CG", false),
  DEMOKRATISCHE_REPUBLIK_KONGO("CD", false),
  DEMOKRATISCHE_VOLKSREPUBLIK_KOREA("KP", false),
  REPUBLIK_KOREA("KR", false),
  KOSOVO("XK", false),
  KROATIEN("HR", true),
  KUBA("CU", false),
  KUWAIT("KW", false),
  LAOS("LA", false),
  LESOTHO("LS", false),
  LETTLAND("LV", true),
  LIBANON("LB", false),
  LIBERIA("LR", false),
  LIBYEN("LY", false),
  LIECHTENSTEIN("LI", false),
  LITAUEN("LT", true),
  LUXEMBURG("LU", true),
  MACAO("MO", false),
  MADAGASKAR("MG", false),
  MALAWI("MW", false),
  MALAYSIA("MY", false),
  MALEDIVEN("MV", false),
  MALI("ML", false),
  MALTA("MT", true),
  MAROKKO("MA", false),
  MARSHALLINSELN("MH", false),
  MARTINIQUE("MQ", false),
  MAURETANIEN("MR", false),
  MAURITIUS("MU", false),
  MAYOTTE("YT", false),
  MAZEDONIEN("MK", false),
  MEXIKO("MX", false),
  MIKRONESIEN("FM", false),
  MOLDAU("MD", false),
  MONACO("MC", false),
  MONGOLEI("MN", false),
  MONTENEGRO("ME", false),
  MONTSERRAT("MS", false),
  MOSAMBIK("MZ", false),
  MYANMAR("MM", false),
  NAMIBIA("NA", false),
  NAURU("NR", false),
  NEPAL("NP", false),
  NEUKALEDONIEN("NC", false),
  NEUSEELAND("NZ", false),
  NICARAGUA("NI", false),
  NIEDERLANDE("NL", true) {
    @Override
    public boolean isNiederlande() {
      return true;
    }
  },
  NIGER("NE", false),
  NIGERIA("NG", false),
  NIUE("NU", false),
  NOERDLICHE_MARIANEN("MP", false),
  NORFOLKINSEL("NF", false),
  NORWEGEN("NO", false),
  OMAN("OM", false),
  OESTERREICH("AT", true),
  PAKISTAN("PK", false),
  PLAESTINA("PS", false),
  PALAU("PW", false),
  PANAMA("PA", false),
  PAPUA_NEUGUINEA("PG", false),
  PARAGUAY("PY", false),
  PERU("PE", false),
  PHILIPPINEN("PH", false),
  PITCAIRNINSELN("PN", false),
  POLEN("PL", true),
  PORTUGAL("PT", true),
  PUERTO_RICO("PR", false),
  REUNION("RE", false),
  RUANDA("RW", false),
  RUMAENIEN("RO", true),
  RUSSLAND("RU", false),
  SAINT_BARTHELEMY("BL", false),
  SAINT_PIERRE("PM", false),
  SALOMONEN("SB", false),
  SAMBIA("ZM", false),
  SAMOA("WS", false),
  SAN_MARINO("SM", false),
  SAO_TOME("ST", false),
  SAUDI_ARABIEN("SA", false),
  SCHWEDEN("SE", true),
  SCHWEIZ("CH", false),
  SENEGAL("SN", false),
  SERBIEN("RS", false),
  SEYCHELLEN("SC", false),
  SIERRA_LEONE("SL", false),
  SIMBABWE("ZW", false),
  SINGAPUR("SG", false),
  SINT_MAARTEN("SX", false),
  SLOWAKEI("SK", true),
  SLOWENIEN("SI", true),
  SOMALIA("SO", false),
  SPANIEN("ES", true),
  SPITZBERGEN("SJ", false),
  SRI_LANKA("LK", false),
  ST_HELENA("SH", false),
  ST_KITTS_NEVIS("KN", false),
  ST_LUCIA("LC", false),
  ST_MARTIN("MF", false),
  ST_VINCENT("VC", false),
  SUEDAFRIKA("ZA", false),
  SUDAN("SD", false),
  SUEDGEORGIEN("GS", false),
  SUEDSUDAN("SS", false),
  SURINAME("SR", false),
  SWASILAND("SZ", false),
  SYRIEN("SY", false),
  TADSCHIKISTAN("TJ", false),
  TAIWAN("TW", false),
  TANSANIA("TZ", false),
  THAILAND("TH", false),
  TIBET("TIBET", false), //ELECTVAPP-717
  TIMOR_LESTE("TL", false),
  TOGO("TG", false),
  TOKELAU("TK", false),
  TONGA("TO", false),
  TRINIDAD_TOBAGO("TT", false),
  TRISTAN_DA_CUNHA("TA", false),
  TSCHAD("TD", false),
  TSCHECHISCHE_REPUBLIK("CZ", true),
  TUNESIEN("TN", false),
  TUERKEI("TR", false),
  TURKMENISTAN("TM", false),
  TURKS_UND_CAICOSINSELN("TC", false),
  TUVALU("TV", false),
  UGANDA("UG", false),
  UKRAINE("UA", false),
  UNGARN("HU", true),
  UNITED_STATES_MINOR_OUTLYING_ISLANDS("UM", false),
  URUGUAY("UY", false),
  USBEKISTAN("UZ", false),
  VANUATU("VU", false),
  VATIKANSTADT("VA", false),
  VENEZUELA("VE", false),
  VEREINIGTE_ARABISCHE_EMIRATE("AE", false),
  VEREINIGTE_STAATEN("US", false),
  VEREINIGTES_KOENIGREICH("GB", false),
  VIETNAM("VN", false),
  WALLIS_FUTUNA("WF", false),
  WEIHNACHTSINSEL("CX", false),
  WEISSRUSSLAND("BY", false),
  WESTSAHARA("EH", false),
  ZENTRALAFRIKANISCHE_REPUBLIK("CF", false),
  ZYPERN("CY", true);

  private static final Logger LOG = LoggerFactory.getLogger(NlWvpStaat.class);

  private final String iso3166Alpha2;

  private final boolean euStaat;

  NlWvpStaat(String iso3166Alpha2, boolean isEuStaat) {
    this.iso3166Alpha2 = iso3166Alpha2;
    this.euStaat = isEuStaat;
  }

  public static NlWvpStaat valueOfIso3166Alpha2(String iso3166Alpha2) {
    if (StringUtils.isBlank(iso3166Alpha2)) {
      return NIEDERLANDE; // ELECT-14529 Kein Land "Unbekannt" zulassen
    } else {
      return Arrays.stream(values()).filter((Staat) -> iso3166Alpha2.equals(Staat.getIso3166Alpha2())).findAny().orElse(UNBEKANNT);
    }
  }

  public String getIso3166Alpha2() {
    return this.iso3166Alpha2;
  }

  public boolean isEuStaat() {
    return this.euStaat;
  }

  public boolean isDeutschland() {
    return false;
  }

  public boolean isNiederlande() {
    return false;
  }

  public boolean isBekannt() {
    return true;
  }
}
