/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at

 * http://www.apache.org/licenses/LICENSE-2.0

 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

package org.apache.directory.scim.server;

import jakarta.enterprise.event.Observes;
import jakarta.enterprise.inject.spi.AfterDeploymentValidation;
import jakarta.enterprise.inject.spi.Bean;
import jakarta.enterprise.inject.spi.BeanManager;
import jakarta.enterprise.inject.spi.Extension;
import jakarta.enterprise.inject.spi.ProcessBean;

import java.util.ArrayList;
import java.util.List;

public class ScimServerInitializer implements Extension {

  private List<Bean<?>> scimConfigBeans = new ArrayList<>();

  public <T> void collect(@Observes ProcessBean<T> event) {
    if (ScimConfiguration.class.isAssignableFrom(event.getBean().getBeanClass())) {
      scimConfigBeans.add(event.getBean());
    }
  }

  public void load(@Observes AfterDeploymentValidation event, BeanManager beanManager) {
    scimConfigBeans.forEach(bean -> {
      ScimConfiguration configBean = (ScimConfiguration) beanManager.getReference(bean, bean.getBeanClass(), beanManager.createCreationalContext(bean));
      configBean.configure();
    });
  }
}
