package com.airlock.iam.admin.infrastructure.mapper.prot;

import com.airlock.iam.base.misc.date.Dates;
import com.airlock.iam.common.application.configuration.userprofile.UserProfileItemConfig.ProfileItemType;
import com.airlock.iam.common.domain.model.user.profileitems.UserProfileItemDetails;
import com.airlock.iam.common.domain.model.user.profileitems.UserProfileItems;
import com.airlock.iam.elog.api.ELogger;
import com.airlock.iam.elog.api.ELoggerFactory;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.time.format.DateTimeParseException;
import java.util.Map;
import java.util.Optional;
import java.util.Map.Entry;
import org.apache.commons.lang3.StringUtils;

public class ContextDataDateConverter {
   private static final ELogger LOG = ELoggerFactory.getLogger(ContextDataDateConverter.class);
   private final UserProfileItems profileItems;

   public void transformDates(Map<String, Object> values) {
      for (Entry<String, Object> e : values.entrySet()) {
         Optional<UserProfileItemDetails> profileItem = this.profileItems.forContextData(e.getKey());
         if (profileItem.isPresent() && profileItem.get().getType() == ProfileItemType.DATE) {
            Object dateValue = this.parseDate(e.getValue());
            values.put(e.getKey(), dateValue);
         }
      }
   }

   private Object parseDate(Object value) {
      if (!(value instanceof String)) {
         return value;
      }

      if (StringUtils.isBlank((String)value)) {
         return null;
      }

      try {
         return Dates.toLocalDate((String)value);
      } catch (DateTimeParseException e) {
         LOG.debug("Failed to parse date: " + value);
         return value;
      }
   }

   @SuppressFBWarnings(justification = "generated code")
   public ContextDataDateConverter(UserProfileItems profileItems) {
      this.profileItems = profileItems;
   }
}
