package org.limewire.ui.swing.search.model;

import org.limewire.core.api.search.SearchCategory;
import org.limewire.core.api.search.SearchListener;
import org.limewire.core.api.search.SearchDetails.SearchType;
import org.limewire.ui.swing.components.DisposalListenerList;
import org.limewire.ui.swing.filter.FilterableSource;
import org.limewire.ui.swing.search.resultpanel.DownloadHandler;

import ca.odell.glazedlists.EventList;
import ca.odell.glazedlists.matchers.MatcherEditor;

/**
 * Defines a data model containing the results of a search.
 */
public interface SearchResultsModel extends FilterableSource<VisualSearchResult>, 
                                            DownloadHandler, 
                                            DisposalListenerList {

    /**
     * Installs the specified search listener and starts the search.  The
     * search listener should handle search results by calling the 
     * <code>addSearchResult(SearchResult)</code> method. 
     */
    void start(SearchListener searchListener);
    
    /**
     * Returns the search category.
     */
    SearchCategory getSearchCategory();
    
    /**
     * Returns the query string for the search.
     */
    String getSearchQuery();
    
    /**
     * Returns the title string for the search.
     */
    String getSearchTitle();
    
    /**
     * Returns the total number of results in the search.
     */
    int getResultCount();

    /**
     * Returns a list of filtered results in the search.
     */
    EventList<VisualSearchResult> getFilteredSearchResults();

    /**
     * Returns a list of sorted and filtered results for the selected search
     * category and sort option.
     */
    EventList<VisualSearchResult> getSortedSearchResults();

    /**
     * Returns the selected search category.
     */
    SearchCategory getSelectedCategory();

    /**
     * Selects the specified search category.
     */
    void setSelectedCategory(SearchCategory searchCategory);
    
    /**
     * Sets the sort option.
     */
    void setSortOption(SortOption sortOption);

    /**
     * Sets the MatcherEditor used to filter search results. 
     */
    @Override
	void setFilterEditor(MatcherEditor<VisualSearchResult> editor);
    
    /**
     * Removes all results from the model
     */
    void clear();

    /**
     * @return The type of the search
     */
    SearchType getSearchType();
    
}
