package com.airlock.iam.base.domain.model.mapification;

import com.airlock.iam.base.api.domain.model.mapification.MapifiedValues;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;

public final class MapifiedValuesBuilder {
   private final Map<String, Object> values = new HashMap<>();

   public static MapifiedValuesBuilder mapifiedValues() {
      return new MapifiedValuesBuilder();
   }

   public MapifiedValuesBuilder put(String key, Object object) {
      this.values.put(key, unwrapMapified(object));
      return this;
   }

   public MapifiedValuesBuilder putIfPresent(String key, Optional<?> optional) {
      optional.ifPresent(value -> this.put(key, value));
      return this;
   }

   public MapifiedValuesBuilder putIfNotEmpty(String key, Collection<?> collection) {
      if (!collection.isEmpty()) {
         this.put(key, collection.stream().map(MapifiedValuesBuilder::unwrapMapified).toList());
      }

      return this;
   }

   public MapifiedValues build() {
      return new MapifiedValues(this.values);
   }

   private static Object unwrapMapified(Object value) {
      return value instanceof MapifiedValues mapifiedValues ? mapifiedValues.asMap() : value;
   }

   @SuppressFBWarnings(justification = "generated code")
   private MapifiedValuesBuilder() {
   }
}
