package eu.dnetlib.espas.gui.shared;

import com.google.gwt.user.client.rpc.IsSerializable;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

public class BrowseResults implements IsSerializable, Serializable {

    private String resultsId;
	
	private Query query = null;
	private List<RefineOption> refineOptions = new ArrayList<RefineOption>();
    private DoubleDateRange doubleDateRange;
	private List<BrowseCategory> browseCategories = new ArrayList<BrowseCategory>();
	private int noOfObservations;
	
	public BrowseResults() {
		super();
	}

	public BrowseResults(String resultsId, Query query, List<RefineOption> refineOptions,
            DoubleDateRange doubleDateRange,
			List<BrowseCategory> refineCategories,
			int noOfObservations) {
		super();
        this.resultsId = resultsId;
		this.query = query;
		this.refineOptions = refineOptions;
        this.doubleDateRange = doubleDateRange;
		this.browseCategories = refineCategories;
		this.noOfObservations = noOfObservations;

		for (RefineOption ro : refineOptions) {
			selectRefineOption(ro.getCategoryName(), ro.getOptionValue());
		}
	}

    public String getResultsId() {
        return resultsId;
    }

    public void setResultsId(String resultsId) {
        this.resultsId = resultsId;
    }

    public Query getQuery() {
        return query;
    }

    public void setQuery(Query query) {
        this.query = query;
    }

    public List<RefineOption> getRefineOptions() {
        return refineOptions;
    }

    public void setRefineOptions(List<RefineOption> refineOptions) {
        this.refineOptions = refineOptions;
    }

    public DoubleDateRange getDoubleDateRange() {
        return doubleDateRange;
    }

    public void setDoubleDateRange(DoubleDateRange doubleDateRange) {
        this.doubleDateRange = doubleDateRange;
    }

    public List<BrowseCategory> getBrowseCategories() {
        return browseCategories;
    }

    public void setBrowseCategories(List<BrowseCategory> browseCategories) {
        this.browseCategories = browseCategories;
    }

    public int getNoOfObservations() {
        return noOfObservations;
    }

    public void setNoOfObservations(int noOfObservations) {
        this.noOfObservations = noOfObservations;
    }

    private void selectRefineOption(String categoryName, String option) {
		
		for (BrowseCategory rc:browseCategories) {
			if (rc.getCategoryName().equals(categoryName)) {
				for (RefineOption ro:rc.getAvailableOptions()) {
					if (ro.getOptionValue().equals(option)) {
						rc.setSelected(true);
						rc.setSelectedOption(ro);
						return;
					}
				}
			}
		}
	}
}
