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

import java.io.File;

import org.limewire.ui.swing.downloads.DownloadMediator;
import org.limewire.ui.swing.library.LibraryMediator;
import org.limewire.ui.swing.search.model.SearchResultsModel;
import org.limewire.ui.swing.search.model.VisualSearchResult;

class DownloadHandlerImpl implements DownloadHandler {
    
    private final SearchResultsModel searchResultsModel;
    private LibraryMediator libraryMediator;
    private final DownloadMediator downloadMediator;
    
    /**
     * Starts all downloads from searches.  Navigates to Library or Downloads without downloading if the file is in either of those locations.
     */
    public DownloadHandlerImpl(SearchResultsModel searchResultsModel,
            LibraryMediator libraryMediator, DownloadMediator downloadMediator) {
        this.searchResultsModel = searchResultsModel;
        this.libraryMediator = libraryMediator;
        this.downloadMediator = downloadMediator;
    }


    @Override
    public void download(final VisualSearchResult vsr) {
        download(vsr, null);
    }

    /**
     * Downloads the file specified in vsr if it is not already downloading or in Library.  Navigates to Downloads or Library if it is already in the locations.
     */
    @Override
    public void download(final VisualSearchResult vsr, File saveFile) {
        if (maybeNavigate(vsr)){
            //do not download if we navigate away
            return;
        }

        // Start download.
        searchResultsModel.download(vsr, saveFile);
    }
    
   private boolean maybeNavigate(VisualSearchResult vsr) {
        switch (vsr.getDownloadState()) {
        case DOWNLOADING:
        case REMOVED:
            downloadMediator.selectAndScrollTo(vsr.getUrn());
            return true;
        case DOWNLOADED:
        case LIBRARY:
            libraryMediator.selectInLibrary(vsr.getUrn());
            return true;
        default:
            return false;
        }
    }

}
