package com.airlock.iam.admin.application.configuration.users;

import com.airlock.iam.base.misc.adapt.Adapter;
import com.airlock.iam.common.api.domain.model.store.user.DeletingUserStore;
import com.airlock.iam.common.api.domain.model.store.user.IdentityChangingUserStore;
import com.airlock.iam.common.api.domain.model.store.user.InsertingUserStore;
import com.airlock.iam.common.api.domain.model.store.user.UserStore;
import java.util.Optional;

public abstract class UserRepositoryConfiguration {
   public abstract UserStore getUserStore();

   public abstract Optional<UserStore> getUserListDetailLoader();

   private <T> Optional<T> getSpecializedStore(Class<T> storeType) {
      return Adapter.adapt(this.getUserStore()).ifPossibleTo(storeType);
   }

   public Optional<DeletingUserStore> getDeletingUserStore() {
      return this.getSpecializedStore(DeletingUserStore.class);
   }

   public Optional<InsertingUserStore> getInsertingUserStore() {
      return this.getSpecializedStore(InsertingUserStore.class);
   }

   public Optional<IdentityChangingUserStore> getIdentityChangingUserStore() {
      return this.getSpecializedStore(IdentityChangingUserStore.class);
   }
}
