package com.airlock.iam.common.domain.model.encoder;

import com.airlock.iam.base.api.domain.model.exception.FailureException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.text.StringEscapeUtils;

public class JsonValueMapEncoder implements ValueMapEncoder {
   @Override
   public Map<String, Object> encodeValues(Map<String, Object> values) {
      return values.entrySet().stream().collect(HashMap::new, (m, e) -> m.put(e.getKey(), this.handleEntry(e.getValue())), Map::putAll);
   }

   private Object handleEntry(Object value) {
      if (value instanceof String stringValue) {
         return StringEscapeUtils.escapeJson(stringValue);
      } else if (value instanceof List<?> list && (list.isEmpty() || isStringList(list))) {
         try {
            return new ObjectMapper().writeValueAsString(list);
         } catch (JsonProcessingException e) {
            throw new FailureException("Could not serialize list to JSON", e);
         }
      } else {
         return value;
      }
   }

   private static boolean isStringList(List<?> list) {
      return list.stream().allMatch(o -> o instanceof String);
   }
}
