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

import com.airlock.iam.admin.application.service.role.RoleService;
import com.airlock.iam.admin.domain.model.user.UserSpecificSettings;
import com.airlock.iam.common.api.domain.model.role.Role;
import com.airlock.iam.common.api.domain.model.store.user.UserStore;
import com.airlock.iam.common.domain.model.role.RolesValidator;
import com.google.inject.PrivateModule;
import com.google.inject.Provides;
import com.google.inject.servlet.RequestScoped;
import jakarta.inject.Named;
import java.util.HashSet;
import java.util.List;
import java.util.Optional;

public class RoleServiceModule extends PrivateModule {
   @Provides
   UserStore provideUserStore(@Named("MANAGED_USERS_STORE") UserStore userStore) {
      return userStore;
   }

   @Provides
   List<Role> provideAvailableRoles(UserSpecificSettings userSpecificSettings) {
      return userSpecificSettings.getAvailableUserRoles().stream().<Role>map(Role::parseRole).toList();
   }

   @Provides
   RolesValidator validator(List<Role> availableRoles) {
      return new RolesValidator(Optional.of(new HashSet<>(availableRoles)), Optional.empty());
   }

   protected void configure() {
      this.bind(RoleService.class).in(RequestScoped.class);
      this.expose(RoleService.class);
   }
}
