package com.airlock.iam.common.domain.model.user.profileitems;

import com.google.common.collect.ImmutableList;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class UserProfileItems {
   private final List<UserProfileItemDetails> listProfileItems;
   private final List<UserProfileItemDetails> detailProfileItems;
   private final Map<String, UserProfileItemDetails> byContextData;

   public UserProfileItems(List<UserProfileItemDetails> listProfileItems, List<UserProfileItemDetails> detailProfileItems) {
      this.listProfileItems = listProfileItems;
      this.detailProfileItems = detailProfileItems;
      this.byContextData = this.buildMap();
   }

   private Map<String, UserProfileItemDetails> buildMap() {
      return Stream.concat(this.listProfileItems.stream(), this.detailProfileItems.stream())
         .distinct()
         .collect(Collectors.toMap(UserProfileItemDetails::getName, Function.identity()));
   }

   public static UserProfileItems empty() {
      return new UserProfileItems(ImmutableList.of(), ImmutableList.of());
   }

   public Optional<UserProfileItemDetails> forContextData(String contextDataField) {
      return Optional.ofNullable(this.byContextData.get(contextDataField));
   }

   public Set<UserProfileItemDetails> getRequiredProfileItems() {
      return this.byContextData.values().stream().filter(item -> !item.isOptional()).collect(Collectors.toSet());
   }

   @SuppressFBWarnings(justification = "generated code")
   public List<UserProfileItemDetails> getListProfileItems() {
      return this.listProfileItems;
   }

   @SuppressFBWarnings(justification = "generated code")
   public List<UserProfileItemDetails> getDetailProfileItems() {
      return this.detailProfileItems;
   }

   @SuppressFBWarnings(justification = "generated code")
   public Map<String, UserProfileItemDetails> getByContextData() {
      return this.byContextData;
   }
}
