# Source: collections/SolrResults.js

    /*global define */
    define(['jquery', 'underscore', 'backbone', 'models/SolrHeader', 'models/SolrResult', 'models/LogsSearch'],
    	function($, _, Backbone, SolrHeader, SolrResult, LogsSearch) {
    	'use strict';

      /**
       @class SolrResultList
       @classdesc A collection of SolrResult models that represent a list of search results from the DataONE query service.
       @extends Backbone.Collection
       @constructor
      */
    	var SolrResultList = Backbone.Collection.extend({
    		// Reference to this collection's model.
    		model: SolrResult,

    		initialize: function(models, options) {

    			if( typeof options === "undefined" || !options ){
    				var options = {};
    			}

    			this.docsCache    = options.docsCache || null;
    		    this.currentquery = options.query   || '*:*';
    		    this.fields 	  = options.fields  || "id,title";
    		    this.rows 		  = options.rows    || 25;
    		    this.start 		  = options.start   || 0;
    		    this.sort 		  = options.sort    || 'dateUploaded desc';
    		    this.facet 		  = options.facet   || [];
    		    this.facetCounts  = "nothing";
    		    this.stats 		  = options.stats   || false;
    		    this.minYear 	  = options.minYear || 1900;
    		    this.maxYear 	  = options.maxYear || new Date().getFullYear();

            //If POST queries are disabled in the whole app, don't use POSTs here
            if( MetacatUI.appModel.get("disableQueryPOSTs") ){
              this.usePOST = false;
            }
            //If this collection was initialized with the usePOST option, use POSTs here
            else if( options.usePOST ){
              this.usePOST = true;
            }
            //Otherwise default to using GET
            else{
              this.usePOST = false;
            }
    		},

    		url: function() {
    			//Convert facet keywords to a string
    			var facetFields = "";

          this.facet = _.uniq(this.facet);

    			for (var i=0; i<this.facet.length; i++){
    				facetFields += "&facet.field=" + this.facet[i];
    			}
    			// limit to matches
    			if (this.facet.length > 0) {
    				facetFields += "&facet.mincount=1"; // only facets meeting the current search
    				facetFields += "&facet.limit=-1"; // CAREFUL: -1 means no limit on the number of facets
    			}

    			//Do we need stats?
    			if (!this.stats){
    				var stats = "";
    			}
    			else{
    				var stats = "&stats=true";
    				for(var i=0; i<this.stats.length; i++){
    					stats += "&stats.field=" + this.stats[i];
    				}
    			}

    			//create the query url
    			var endpoint = MetacatUI.appModel.get('queryServiceUrl') + "q=" + this.currentquery;

          if(this.fields)
            endpoint += "&fl=" + this.fields;
          if(this.sort)
            endpoint += "&sort=" + this.sort;
          if( typeof this.rows == "number" || (typeof this.rows == "string" && this.rows.length))
            endpoint += "&rows=" + this.rows;
          if( typeof this.start == "number" || (typeof this.start == "string" && this.start.length))
            endpoint += "&start=" + this.start;
          if( this.facet.length > 0 )
            endpoint += "&facet=true&facet.sort=index" + facetFields;

          endpoint += stats + "&wt=json";

    			return endpoint;
    		},

    		parse: function(solr) {

    			//Is this our latest query? If not, use our last set of docs from the latest query
    			if((decodeURIComponent(this.currentquery).replace(/\+/g, " ") != solr.responseHeader.params.q) && this.docsCache)
    				return this.docsCache;

    			//Save some stats
    			this.header = new SolrHeader(solr.responseHeader);
    			this.header.set({"numFound" : solr.response.numFound});
    			this.header.set({"start" : solr.response.start});
    			this.header.set({"rows" : solr.responseHeader.params.rows});

    			//Get the facet counts and store them in this model
          if( solr.facet_counts ){
            this.facetCounts = solr.facet_counts.facet_fields;
          }

    			//Cache this set of results
    			this.docsCache = solr.response.docs;

    			return solr.response.docs;
    		},

    		nextpage: function() {
    			// Only increment the page if the current page is not the last page
    			if (this.start + this.rows < this.header.get("numFound")) {
    				this.start += this.rows;
    			}
    			if (this.header != null) {
    				this.header.set({"start" : this.start});
    			}

    			var fetchOptions = this.createFetchOptions();
    			this.fetch(fetchOptions);
    		},

    		prevpage: function() {
    			this.start -= this.rows;
    			if (this.start < 0) {
    				this.start = 0;
    			}
    			if (this.header != null) {
    				this.header.set({"start" : this.start});
    			}

    			var fetchOptions = this.createFetchOptions();
    			this.fetch(fetchOptions);
    		},

    		toPage: function(page) {
    			// go to the requested page
    			var requestedStart = this.rows * page;
    			if (this.header != null) {
    				if (requestedStart < this.header.get("numFound")) {
    					this.start = requestedStart;
    				}
    				this.header.set({"start" : this.start});
    			}

    			var fetchOptions = this.createFetchOptions();
    			this.fetch(fetchOptions);
    		},

    		setrows: function(numrows) {
    			this.rows = numrows;
    		},

    		query: function(newquery) {

          if(typeof newquery != "undefined" && this.currentquery != newquery){
    				this.currentquery = newquery;
    				this.start = 0;
    			}

    			var fetchOptions = this.createFetchOptions();
    			this.fetch(fetchOptions);
    		},

    		setQuery: function(newquery) {
    			if (this.currentquery != newquery) {
    				this.currentquery = newquery;
    				this.start = 0;

    			}
    		},

    		setfields: function(newfields) {
    				this.fields = newfields;
    		},

    		setSort: function(newsort) {
    			this.sort = newsort;
    		},

    		setFacet: function(fields) {
    			this.facet = fields;
    		},

    		setStats: function(fields){
    			this.stats = fields;
    		},

    		createFetchOptions: function(){
    			var options = {
    				start : this.start,
    				reset: true
    			}

          if( this.usePOST ){
            options.type = "POST";

            var queryData = new FormData();
            queryData.append("q", decodeURIComponent(this.currentquery));
            queryData.append("rows", this.rows);
            queryData.append("sort", this.sort);
            queryData.append("fl", this.fields);
            queryData.append("start", this.start);
            queryData.append("wt", "json");

            //Add the facet fields to the FormData
            if( this.facet.length ){

              queryData.append("facet", "true");

        			for (var i=0; i<this.facet.length; i++){
        				queryData.append("facet.field", this.facet[i]);
        			}

              queryData.append("facet.mincount", "1");
              queryData.append("facet.limit", "-1");
              queryData.append("facet.sort", "index");

            }

            //Add stats to the FormData
            if( this.stats.length ){

              queryData.append("stats", "true");

              for(var i=0; i<this.stats.length; i++){
      					queryData.append("stats.field", this.stats[i]);
      				}

            }

            options.data = queryData;
            options.contentType = false;
            options.processData = false;
            options.dataType = "json";
            options.url = MetacatUI.appModel.get("queryServiceUrl");

          }

    			return _.extend(options, MetacatUI.appUserModel.createAjaxSettings());
    		}
    	});

    	return SolrResultList;
    });