package com.airlock.iam.common.infrastructure.mapper;

import com.airlock.iam.core.misc.util.locale.LocaleUtil;
import ma.glasnost.orika.MappingContext;
import ma.glasnost.orika.converter.BidirectionalConverter;
import ma.glasnost.orika.metadata.Type;

public class LowercaseEnumConverter<T extends Enum<T>> extends BidirectionalConverter<String, Enum<T>> {
   static final ConverterId ID = ConverterId.LOWERCASE_ENUM_CONVERTER;

   public Enum<T> convertTo(String source, Type<Enum<T>> destinationType, MappingContext mappingContext) {
      for (Enum<T> enumConstant : (Enum[])destinationType.getRawType().getEnumConstants()) {
         if (enumConstant.name().toLowerCase(LocaleUtil.getForSystemStrings()).equals(source)) {
            return enumConstant;
         }
      }

      throw new IllegalStateException(String.format("Cannot map '%s' to an enum of type '%s'", source, destinationType.getName()));
   }

   public String convertFrom(Enum<T> source, Type<String> destinationType, MappingContext mappingContext) {
      return source.name().toLowerCase(LocaleUtil.getForSystemStrings());
   }
}
