package org.apache.felix.dm.lambda;

import org.apache.felix.dm.lambda.callbacks.CbBundle;
import org.apache.felix.dm.lambda.callbacks.CbBundleComponent;
import org.apache.felix.dm.lambda.callbacks.InstanceCbBundle;
import org.apache.felix.dm.lambda.callbacks.InstanceCbBundleComponent;

/**
 * Builds a Dependency Manager bundle adapter. The adapter created by this builder will be applied to any bundle that matches the specified 
 * bundle state mask and filter condition. For each matching bundle an adapter service will be created based on the adapter implementation class. 
 * The adapter will be registered with the specified interface and existing properties from the original bundle plus any extra properties 
 * you supply here. The bundle is injected by reflection in adapter class fields having a Bundle type, or using a callback method that you can 
 * specify.
 * 
 * You can specify reflection based (using method names), or java8 method references for callbacks.
 * 
 * <p> Example which creates a BundleAdapter service for each started bundle (the bundle is added by reflection on
 * a class field that has a "Bundle" type):
 * 
 * <pre> {@code
 * public class Activator extends DependencyManagerActivator {
 *     public void init(BundleContext ctx, DependencyManager dm) throws Exception { 
 *       bundleAdapter(adapt -> adapt
 *           .impl(BundleAdapterImpl.class)
 *           .provides(BundleAdapter.class)
 *           .mask(Bundle.INSTALLED | Bundle.RESOLVED | Bundle.ACTIVE));
 *    }
 * }
 * } </pre>
 * 
 * Example that creates a BundleAdapter service for each started bundle (the bundle is added using a method reference):
 * 
 * <pre> {@code
 * public class Activator extends DependencyManagerActivator {
 *     public void init(BundleContext ctx, DependencyManager dm) throws Exception { 
 *       bundleAdapter(adapt -> adapt
 *           .impl(BundleAdapterImpl.class)
 *           .provides(BundleAdapter.class)
 *           .mask(Bundle.INSTALLED | Bundle.RESOLVED | Bundle.ACTIVE)
 *           .add(BundleAdapterImpl::setBundle));
 *    }
 * }
 * }</pre>
 *
 * Example that creates a BundleAdapter service for each started bundle (the bundle is added using a method name):
 * 
 * <pre> {@code
 * public class Activator extends DependencyManagerActivator {
 *     public void init(BundleContext ctx, DependencyManager dm) throws Exception { 
 *       bundleAdapter(adapt -> adapt
 *           .impl(BundleAdapterImpl.class)
 *           .provides(BundleAdapter.class)
 *           .mask(Bundle.INSTALLED | Bundle.RESOLVED | Bundle.ACTIVE)
 *           .add("setBundle"));
 *    }
 * }
 * }</pre>
 *
 * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
 */
public interface BundleAdapterBuilder extends ComponentBuilder<BundleAdapterBuilder> {
    /**
     * Sets the bundle state mask to depend on. The OSGi BundleTracker explains this mask in more detail, but
     * it is basically a mask with flags for each potential state a bundle can be in.
     * 
     * @param mask the mask to use
     * @return this builder
     */
    BundleAdapterBuilder mask(int mask);
    
    /**
     * Sets the filter condition to depend on. Filters are matched against the full manifest of a bundle.
     * 
     * @param filter the filter condition
     * @return this builder
     */
    BundleAdapterBuilder filter(String filter);

    /**
     * Sets property propagation. If set to <code>true</code> any bundle manifest properties will be added
     * to the service properties of the component that has this dependency (if it registers as a service).
     * 
     * @param propagate <code>true</code> to propagate the bundle manifest properties
     * @return this builder
     */
    BundleAdapterBuilder propagate(boolean propagate);
    
    /**
     * Enables property propagation. Any bundle manifest properties will be added
     * to the service properties of the component that has this dependency (if it registers as a service).
     * 
     * @return this builder
     */
    BundleAdapterBuilder propagate();
    
    /**
     * Sets a "add" callback name invoked on the component implementation instance(s).
     * The callback can be used as hooks whenever the dependency is added. When you specify a callback, 
     * the auto configuration feature is automatically turned off, because we're assuming you don't need it in this case.
     * 
     * @param callback the method to call when a bundle was added
     * 
     * The following method signature are supported:
     * <pre>{@code
     * callback(Bundle b)
     * callback(Component c, Bundle b)
     * }</pre>
     * 
     * @param callback the callback name
     * @return this builder.
     */
    BundleAdapterBuilder add(String callback);
    
    /**
     * Sets a "change" callback name invoked on the component implementation instance(s).
     * The callback can be used as hooks whenever the dependency is changed. When you specify a callback, 
     * the auto configuration feature is automatically turned off, because we're assuming you don't need it in this case.
     * 
     * @param callback the method to call when a bundle was changed
     * 
     * The following method signature are supported:
     * <pre>{@code
     * callback(Bundle b)
     * callback(Component c, Bundle b)
     * }</pre>
     * 
     * @param callback the callback name
     * @return this builder.
     */
     BundleAdapterBuilder change(String callback);
 
     /**
      * Sets a "remove" callback name invoked on the component implementation instance(s).
      * The callback can be used as hooks whenever the dependency is removed. When you specify a callback, 
      * the auto configuration feature is automatically turned off, because we're assuming you don't need it in this case.
      * 
      * @param callback the method to call when a bundle was removed
      * 
      * The following method signature are supported:
      * <pre>{@code
      * callback(Bundle b)
      * callback(Component c, Bundle b)
      * }</pre>
      * 
      * @param callback the callback name
      * @return this builder.
      */
     BundleAdapterBuilder remove(String callback);
     
     /**
      * Sets a callback instance to use when invoking reflection based callbacks.
      * 
      * @param callbackInstance the instance to call the reflection based callbacks on
      * @return this builder.
      * @see #add(String)
      * @see #change(String)
      * @see #remove(String)
      */
     BundleAdapterBuilder callbackInstance(Object callbackInstance);

    /**
     * Sets a reference to a callback method invoked on one of the component implementation classes.
     * The method reference must point to a Component implementation class method, it is called when the bundle is added
     * and takes as argument a Bundle.
     * 
     * @param <T> the type of the component instance class on which the callback is invoked.
     * @param add the method reference invoked when a bundle is added.
     * @return this builder
     */
    <T> BundleAdapterBuilder add(CbBundle<T> add);
    
    /**
     * Sets a reference to a callback method invoked on one of the component implementation classes.
     * The method reference must point to a Component implementation class method, it is called when the bundle is changed
     * and takes as argument a Bundle.
     * 
     * @param <T> the type of the component instance class on which the callback is invoked.
     * @param change the method reference invoked when a bundle has changed.
     * @return this builder
     */
    <T> BundleAdapterBuilder change(CbBundle<T> change);
    
    /**
     * Sets a reference to a callback method invoked on one of the component implementation classes.
     * The method reference must point to a Component implementation class method, it is called when the bundle is removed
     * and takes as argument a Bundle.
     * 
     * @param <T> the type of the component instance class on which the callback is invoked.
     * @param remove the method reference invoked when a bundle is removed.
     * @return this builder
     */
    <T> BundleAdapterBuilder remove(CbBundle<T> remove);
    
    /**
     * Sets a reference to a callback method invoked on one of the component implementation classes.
     * The method reference must point to a Component implementation class method, it is called when the bundle is added
     * and takes as argument a Bundle and a Component.
     * 
     * @param <T> the type of the component instance class on which the callback is invoked.
     * @param add the method reference invoked when a bundle is added.
     * @return this builder
     */
    <T> BundleAdapterBuilder add(CbBundleComponent<T> add);    
    
    /**
     * Sets a reference to a callback method invoked on one of the component implementation classes.
     * The method reference must point to a Component implementation class method, it is called when the bundle is changed
     * and takes as argument a Bundle and a Component.
     * 
     * @param <T> the type of the component instance class on which the callback is invoked.
     * @param change the method reference invoked when a bundle has changed.
     * @return this builder
     */
    <T> BundleAdapterBuilder change(CbBundleComponent<T> change);    
    
    /**
     * Sets a reference to a callback method invoked on one of the component implementation classes.
     * The method reference must point to a Component implementation class method, it is called when the bundle is removed
     * and takes as argument a Bundle and a Component.
     * 
     * @param <T> the type of the component instance class on which the callback is invoked.
     * @param remove the method reference invoked when a bundle is removed.
     * @return this builder
     */
    <T> BundleAdapterBuilder remove(CbBundleComponent<T> remove);    

    /**
     * Sets a reference to a callback method invoked on a given Object instance.
     * The method reference is invoked when the bundle is added and takes as argument a Bundle.
     * 
     * @param add the method reference invoked when a bundle is added.
     * @return this builder
     */
    BundleAdapterBuilder add(InstanceCbBundle add);
    
    /**
     * Sets a reference to a callback method invoked on a given Object instance.
     * The method reference is invoked when the bundle has changed and takes as argument a Bundle.
     * 
     * @param change the method reference invoked when a bundle has changed.
     * @return this builder
     */
    BundleAdapterBuilder change(InstanceCbBundle change);
    
    /**
     * Sets a reference to a callback method invoked on a given Object instance.
     * The method reference is invoked when the bundle is removed and takes as argument a Bundle.
     * 
     * @param remove the method reference invoked when a bundle is removed.
     * @return this builder
     */
    BundleAdapterBuilder remove(InstanceCbBundle remove);

    /**
     * Sets a reference to a callback method invoked on a given Object instance.
     * The method reference is invoked when the bundle is added and takes as argument a Bundle and a Component.
     * 
     * @param add the method reference invoked when a bundle is added.
     * @return this builder
     */
    BundleAdapterBuilder add(InstanceCbBundleComponent add);
    
    /**
     * Sets a reference to a callback method invoked on a given Object instance.
     * The method reference is invoked when the bundle has changed and takes as argument a Bundle and a Component.
     * 
     * @param change the method reference invoked when a bundle has changed.
     * @return this builder
     */
    BundleAdapterBuilder change(InstanceCbBundleComponent change);
    
    /**
     * Sets a reference to a callback method invoked on a given Object instance.
     * The method reference is invoked when the bundle is removed and takes as argument a Bundle and a Component.
     * 
     * @param remove the method reference invoked when a bundle is removed.
     * @return this builder
     */
    BundleAdapterBuilder remove(InstanceCbBundleComponent remove);
}
