package com.airlock.iam.admin.infrastructure.factory.prot;

import com.airlock.iam.admin.api.domain.model.administrator.CurrentAdministrator;
import com.airlock.iam.admin.application.configuration.realm.RealmAdministrationConfig;
import com.airlock.iam.admin.domain.model.user.Restrictions;
import com.airlock.iam.admin.domain.service.user.RealmUserRestrictionProvider;
import com.airlock.iam.base.api.domain.model.store.query.Restriction;
import com.airlock.iam.common.api.domain.model.store.user.UserStore;
import com.airlock.iam.common.api.domain.model.store.user.schema.UserSchema;
import com.google.inject.Exposed;
import com.google.inject.PrivateModule;
import com.google.inject.Provides;
import com.google.inject.servlet.RequestScoped;
import jakarta.inject.Named;
import java.util.Optional;
import java.util.stream.Collectors;

public class RestrictionsModule extends PrivateModule {
   @RequestScoped
   @Provides
   @Exposed
   Restrictions provideRestrictions(
      @Named("MANAGED_USERS_STORE") UserStore userStore,
      Optional<RealmAdministrationConfig> realmAdministrationConfig,
      CurrentAdministrator currentAdministrator
   ) {
      return new Restrictions(this.realmRestriction(userStore, realmAdministrationConfig, currentAdministrator).stream().collect(Collectors.toList()));
   }

   private Optional<Restriction> realmRestriction(
      @Named("MANAGED_USERS_STORE") UserStore userStore,
      Optional<RealmAdministrationConfig> realmAdministrationConfig,
      CurrentAdministrator currentAdministrator
   ) {
      return realmAdministrationConfig.flatMap(
         config -> RealmUserRestrictionProvider.builder()
            .schema((UserSchema)userStore.schema())
            .adminContextDataFieldName(config.getAdminRealmContextDataName().getContextDataName())
            .userContextDataFieldName(config.getUserRealmContextDataName().getContextDataName())
            .currentAdministrator(currentAdministrator)
            .build()
            .getRestriction()
      );
   }

   protected void configure() {
   }
}
