package de.ivu.elect.was.exchange.wahl;

import de.ivu.elect.business.gebietsbaum.entity.Gebietsart;
import de.ivu.elect.business.gebietsbaum.entity.NlGebietsart;
import de.ivu.wahl.wus.oasis.eml.kiesraad.RegionCategoryType;

import java.util.EnumMap;
import java.util.Map;

public class NlGebietsartEmlMapper {

  private static final Map<NlGebietsart, RegionCategoryType> EXTERN_NACH_INTERN;
  private static final Map<RegionCategoryType, NlGebietsart> INTERN_NACH_EXTERN;


  static {
    INTERN_NACH_EXTERN = new EnumMap<>(RegionCategoryType.class);

    INTERN_NACH_EXTERN.put(RegionCategoryType.DEELGEMEENTE, NlGebietsart.DEELGEMEENTE);
    INTERN_NACH_EXTERN.put(RegionCategoryType.GEMEENTE, NlGebietsart.GEMEENTE);
    INTERN_NACH_EXTERN.put(RegionCategoryType.KIESCOLLEGE, NlGebietsart.KIESCOLLEGE);
    INTERN_NACH_EXTERN.put(RegionCategoryType.KIESKRING, NlGebietsart.KIESKRING);
    INTERN_NACH_EXTERN.put(RegionCategoryType.PROVINCIE, NlGebietsart.PROVINCIE);
    INTERN_NACH_EXTERN.put(RegionCategoryType.PROVINCIAAL_KIESKRING, NlGebietsart.KIESKRING);
    INTERN_NACH_EXTERN.put(RegionCategoryType.PROVINCIAAL_STEMBUREAU, NlGebietsart.STIMMBEZIRK);
    INTERN_NACH_EXTERN.put(RegionCategoryType.STAAT, NlGebietsart.STAAT);
    INTERN_NACH_EXTERN.put(RegionCategoryType.STEMBUREAU, NlGebietsart.STIMMBEZIRK);
    INTERN_NACH_EXTERN.put(RegionCategoryType.WATERSCHAP, NlGebietsart.WATERSCHAP);
    INTERN_NACH_EXTERN.put(RegionCategoryType.WATERSCHAP_KIESKRING, NlGebietsart.KIESKRING);
    INTERN_NACH_EXTERN.put(RegionCategoryType.WATERSCHAP_GEMEENTE, NlGebietsart.GEMEENTE);

    EXTERN_NACH_INTERN = new EnumMap<>(NlGebietsart.class);
    EXTERN_NACH_INTERN.put(NlGebietsart.DEELGEMEENTE, RegionCategoryType.DEELGEMEENTE);
    EXTERN_NACH_INTERN.put(NlGebietsart.GEMEENTE, RegionCategoryType.GEMEENTE);
    EXTERN_NACH_INTERN.put(NlGebietsart.GEMEENTE_FRYSK, RegionCategoryType.GEMEENTE);
    EXTERN_NACH_INTERN.put(NlGebietsart.OPENBAAR_LICHAAM, RegionCategoryType.GEMEENTE);
    EXTERN_NACH_INTERN.put(NlGebietsart.KIESCOLLEGE, RegionCategoryType.KIESCOLLEGE);
    EXTERN_NACH_INTERN.put(NlGebietsart.KIESKRING, RegionCategoryType.KIESKRING);
    EXTERN_NACH_INTERN.put(NlGebietsart.PROVINCIE, RegionCategoryType.PROVINCIE);
    EXTERN_NACH_INTERN.put(NlGebietsart.STAAT, RegionCategoryType.STAAT);
    EXTERN_NACH_INTERN.put(NlGebietsart.WATERSCHAP, RegionCategoryType.WATERSCHAP);
    EXTERN_NACH_INTERN.put(NlGebietsart.STIMMBEZIRK, RegionCategoryType.STEMBUREAU);
    EXTERN_NACH_INTERN.put(NlGebietsart.BRIEFWAHLBEZIRK, RegionCategoryType.STEMBUREAU);

  }


  public Gebietsart mappeGebietsart(NlGebietsart nlGebietsart) {
    Gebietsart result = new Gebietsart();
    result.setName(nlGebietsart.name());
    return result;
  }

  public NlGebietsart getNlGebietsart(RegionCategoryType regionCategoryType, boolean isFrysian) {
    NlGebietsart nlGebietsart = INTERN_NACH_EXTERN.get(regionCategoryType);
    if (nlGebietsart.isGemeinde() && isFrysian) {
      return NlGebietsart.GEMEENTE_FRYSK; // ELECT-9671
    }
    return nlGebietsart;
  }

  public RegionCategoryType mappeGebietsart(Gebietsart gebietsart) {
    return mappeGebietsart(gebietsart.getName());
  }

  private RegionCategoryType mappeGebietsart(String name) {
    return EXTERN_NACH_INTERN.get(NlGebietsart.from(name));
  }

}
