package org.rhq.enterprise.server.inventory;

import java.util.List;

import javax.ejb.Local;

import org.rhq.core.domain.resource.ResourceType;

/**
 * Provides methods for carrying resource type deletion.
 */
@Local
public interface InventoryManagerLocal {

    /**
     * Marks the specified resource types for deletion by setting the deleted
     * flag on each one. If <code>uninventoryResources</code> is true then all resources of the affected types are removed from
     * inventory as well. Marking a resource type for deletion will effectively result in the resource type and all of
     * its associated meta data being removed from the system. That meta data includes metric definitions, operation 
     * definitions, resource configuration definitions, plugin configuration definitions, event definitions, etc. 
     * Note that this method only marks the resource types and their resources for deletion. The actual deletion is 
     * carried out by asynchronously by a scheduled job (which ultimately will uninventory the resources if not done
     * beforehand).
     *
     * @param resourceTypeIds The ids of the resource types to delete
     * @param uninventoryResources True to uninventory the resources of the marked types, False to ignore the resources
     * 
     * @return The number of types marked for deletion.
     */
    int markTypesDeleted(List<Integer> resourceTypeIds, boolean uninventoryResources);

    /**
     * @return A list of all resource types that are marked for deletion
     */
    List<ResourceType> getDeletedTypes();

    /**
     * Determines whether or not a resource type is ready to be permanently removed from the database. A resource type
     * is ready to be removed if 1) its deleted flag has been set and 2) if all of its resources have already been
     * removed from the database.
     *
     * @param resourceType The resource type to check
     * @return <code>true</code> if the resource type is ready to be permanently deleted.
     */
    boolean isReadyForPermanentRemoval(ResourceType resourceType);

    /**
     * Permanently removes the resource type from the database along with all associated meta data such as metric
     * definitions, operation definitions, and resource configuration definitions. This method is intended to be called
     * by the scheduled job {@link org.rhq.enterprise.server.scheduler.jobs.PurgeResourceTypesJob}.
     *
     * @param resourceType The resource type to delete
     */
    void purgeDeletedResourceType(ResourceType resourceType);

}
