package com.airlock.iam.admin.infrastructure.service;

import com.airlock.iam.base.api.infrastructure.plugin.PluginConfigToLogic;
import com.airlock.iam.common.application.configuration.userprofile.StringUserProfileItemConfig;
import com.airlock.iam.common.application.configuration.userprofile.UserProfileItemConfig;
import com.airlock.iam.common.application.configuration.userprofile.UserProfileItemConfig.ProfileItemType;
import com.airlock.iam.common.domain.model.user.profileitems.ListProfileItemLogic;
import com.airlock.iam.common.domain.model.user.profileitems.UserProfileItemDetails;
import com.airlock.iam.common.domain.model.user.profileitems.UserProfileItemDetails.UserProfileItemDetailsBuilder;
import java.util.List;
import java.util.Optional;
import java.util.function.Predicate;
import java.util.stream.Collectors;

public final class ProfileItems {
   private ProfileItems() {
   }

   public static List<UserProfileItemDetails> asProfileItemDetails(
      List<UserProfileItemConfig> items, Predicate<UserProfileItemConfig> editable, PluginConfigToLogic toLogic
   ) {
      return items.stream().map(item -> convert(item, editable, toLogic)).collect(Collectors.toList());
   }

   private static UserProfileItemDetails convert(UserProfileItemConfig item, Predicate<UserProfileItemConfig> editable, PluginConfigToLogic toLogic) {
      UserProfileItemDetailsBuilder details = UserProfileItemDetails.builder()
         .type(item.getItemType())
         .logic(item.getProfileItemLogic())
         .name(item.getPropertyName())
         .resourceKey(item.getStringResourceKey())
         .optional(item.isOptional())
         .editable(editable.test(item))
         .sortable(item.isSortable());
      if (item.getItemType() == ProfileItemType.LIST) {
         ListProfileItemLogic listLogic = (ListProfileItemLogic)item.getProfileItemLogic();
         details.options(listLogic.getItems()).optionsAreResourceKeys(listLogic.isItemsAreResourceKeys()).resourceKeyPrefix(listLogic.getResourceKeyPrefix());
      }

      if (item.getItemType() == ProfileItemType.STRING && item instanceof StringUserProfileItemConfig config) {
         details.prefill(Optional.ofNullable(config.getPrefill()).map(toLogic::getLogic));
      } else {
         details.prefill(Optional.empty());
      }

      return details.build();
   }
}
