package com.airlock.iam.oauth2.domain.service.accountlinking;

import com.airlock.iam.common.domain.model.accountlink.AccountInfo;
import com.airlock.iam.common.domain.model.accountlink.AccountLinkDataToPersist;
import com.airlock.iam.common.domain.model.accountlink.AccountSub;
import com.airlock.iam.common.domain.model.accountlink.persistence.AccountLinkData;
import com.airlock.iam.common.domain.model.provider.ProviderId;
import com.airlock.iam.common.domain.service.accountlink.persistence.AccountLinkPersister;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.Optional;
import lombok.NonNull;

public final class AccountLinkRepositoryImpl implements AccountLinkRepository {
   @NonNull
   private final AccountLinkPersister persister;

   @Override
   public Optional<String> findUsernameForProvider(ProviderId provider, AccountSub accountSub) {
      Optional<AccountLinkData> data = this.persister.findUnique(provider, accountSub);
      return data.map(AccountLinkData::getUsername);
   }

   @Override
   public AccountLinkData persistAndLoadAccountLink(String username, ProviderId provider, AccountSub accountSub, AccountInfo accountInfo) {
      AccountLinkDataToPersist accountLinkDataToPersist = AccountLinkDataToPersist.accountLinkDataToPersist(
         username, provider.id(), accountSub.sub(), accountInfo.info()
      );
      return this.persister.persistAndLoad(accountLinkDataToPersist);
   }

   @SuppressFBWarnings(justification = "generated code")
   AccountLinkRepositoryImpl(@NonNull AccountLinkPersister persister) {
      if (persister == null) {
         throw new NullPointerException("persister is marked non-null but is null");
      }

      this.persister = persister;
   }

   @SuppressFBWarnings(justification = "generated code")
   public static AccountLinkRepositoryImpl.AccountLinkRepositoryImplBuilder builder() {
      return new AccountLinkRepositoryImpl.AccountLinkRepositoryImplBuilder();
   }

   @SuppressFBWarnings(justification = "generated code")
   public static class AccountLinkRepositoryImplBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private AccountLinkPersister persister;

      @SuppressFBWarnings(justification = "generated code")
      AccountLinkRepositoryImplBuilder() {
      }

      @SuppressFBWarnings(justification = "generated code")
      public AccountLinkRepositoryImpl.AccountLinkRepositoryImplBuilder persister(@NonNull AccountLinkPersister persister) {
         if (persister == null) {
            throw new NullPointerException("persister is marked non-null but is null");
         }

         this.persister = persister;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public AccountLinkRepositoryImpl build() {
         return new AccountLinkRepositoryImpl(this.persister);
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "AccountLinkRepositoryImpl.AccountLinkRepositoryImplBuilder(persister=" + this.persister + ")";
      }
   }
}
