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

import java.util.Map;
import java.util.Map.Entry;
import java.util.stream.Collectors;
import ma.glasnost.orika.CustomConverter;
import ma.glasnost.orika.MappingContext;
import ma.glasnost.orika.metadata.Type;

public final class MapToObjectConverter extends CustomConverter<Map<String, ?>, Object> {
   public Object convert(Map<String, ?> source, Type<?> destinationType, MappingContext mappingContext) {
      return source.entrySet()
         .stream()
         .filter(e -> e.getValue() != null)
         .collect(Collectors.toMap(Entry::getKey, e -> this.mapperFacade.map(e.getValue(), Object.class)));
   }

   public boolean canConvert(Type<?> sourceType, Type<?> destinationType) {
      return Map.class.isAssignableFrom(sourceType.getRawType()) && destinationType.getRawType().equals(Object.class);
   }
}
