package org.limewire.setting.evt;

import org.limewire.setting.SettingsGroup;
import org.limewire.setting.SettingsGroupManager;

/**
 * SettingsHandlerEvent are fired when a {@link SettingsGroupManager} instance changed.
 */
public class SettingsGroupManagerEvent {
    
    /**
     * Various types of events that may occur.
     */
    public static enum EventType {
        
        /**
         * Fired when Settings were added to the handler.
         */
        SETTINGS_GROUP_ADDED,
        
        /**
         * Fired when Settings were removed from the handler.
         */
        SETTINGS_GROUP_REMOVED,
        
        /**
         * Fired when all Settings were reloaded.
         */
        RELOAD,
        
        /**
         * Fired when all Settings were saved.
         */
        SAVE,
        
        /**
         * Fired when all Settings were revered back to
         * the default values.
         */
        REVERT_TO_DEFAULT,
        
        /**
         * Fired when the should save flag was changed.
         */
        SHOULD_SAVE
    }
    
    private final EventType type;
    
    private final SettingsGroupManager manager;
    
    private final SettingsGroup group;
    
    /**
     * Constructs a SettingsHandlerEvent.
     * 
     * @param type the type of the event
     * @param manager the handler that triggered this event
     * @param group the SettingsGroup instance that was added or removed (null in other cases)
     */
    public SettingsGroupManagerEvent(EventType type, SettingsGroupManager manager, SettingsGroup group) {
        if (type == null) {
            throw new NullPointerException("EventType is null");
        }
        
        if (manager == null) {
            throw new NullPointerException("SettingsGroupManager is null");
        }
        
        this.type = type;
        this.manager = manager;
        this.group = group;
    }
    
    /**
     * Returns the type of the event.
     */
    public EventType getEventType() {
        return type;
    }
    
    /**
     * Returns the SettingsHandler instance that triggered this event.
     */
    public SettingsGroupManager getSettingsManager() {
        return manager;
    }
    
    /**
     * The SettingsGroup instance that was added or removed. It's null in
     * all other cases.
     */
    public SettingsGroup getSettingsGroup() {
        return group;
    }
    
    @Override
    public String toString() {
        return type.toString();
    }
}
