package com.airlock.iam.admin.application.service.accountlink;

import com.airlock.iam.base.api.domain.model.user.UserId;
import com.airlock.iam.common.domain.model.accountlink.AccountLinkId;
import com.airlock.iam.common.domain.model.accountlink.persistence.AccountLinkData;
import com.airlock.iam.common.domain.service.accountlink.persistence.AccountLinkPersister;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.Collection;
import java.util.Optional;
import java.util.function.Predicate;
import org.apache.commons.lang3.Strings;

public class AccountLinkService {
   private final AccountLinkPersister persister;

   public Collection<AccountLinkData> accountLinks(UserId userId) {
      return this.persister.findByUser(userId.getValue());
   }

   public Optional<AccountLinkData> findLink(UserId userId, String providerId) {
      return this.accountLinks(userId).stream().filter(matchingProvider(providerId)).findFirst();
   }

   public void unlink(AccountLinkId accountLinkId) {
      this.persister.delete(accountLinkId);
   }

   private static Predicate<AccountLinkData> matchingProvider(String providerId) {
      return data -> Strings.CS.equals(data.getProviderId(), providerId);
   }

   @SuppressFBWarnings(justification = "generated code")
   public AccountLinkService(AccountLinkPersister persister) {
      this.persister = persister;
   }
}
