package com.airlock.iam.common.domain.service.termsofservice;

import com.airlock.iam.common.api.domain.model.contextdata.ContextData;
import com.airlock.iam.common.api.domain.model.contextdata.ContextDataItem;
import com.airlock.iam.common.application.configuration.termsofservice.TermsOfServiceConfig;
import com.airlock.iam.common.domain.model.termsofservice.TermsOfServiceTag;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

public class CommonTermsOfServiceService {
   private final Provider<List<TermsOfServiceConfig>> termsOfServiceConfigs;

   @Inject
   public CommonTermsOfServiceService(Provider<List<TermsOfServiceConfig>> termsOfServiceConfigs) {
      this.termsOfServiceConfigs = termsOfServiceConfigs;
   }

   public boolean hasOpen(ContextData contextData) {
      return !this.getAllOpen(contextData).isEmpty();
   }

   public List<TermsOfServiceConfig> getAllOpen(ContextData contextData) {
      return ((List)this.termsOfServiceConfigs.get()).stream().filter(tos -> !this.hasAccepted(contextData, tos)).collect(Collectors.toList());
   }

   public List<TermsOfServiceConfig> collectTermsOfServicesToAccept(Set<TermsOfServiceTag> tags) {
      return ((List)this.termsOfServiceConfigs.get()).stream().filter(tos -> tags.contains(new TermsOfServiceTag(tos.getTag()))).collect(Collectors.toList());
   }

   private boolean hasAccepted(ContextData contextData, TermsOfServiceConfig tosConfig) {
      return contextData.find(tosConfig.getUserPropertyName())
         .map(ContextDataItem::getValue)
         .map(tag -> !tosConfig.getLogic().doesUserHaveToAcceptDisclaimer(tag))
         .orElse(false);
   }
}
