# Source: src/js/models/LogsSearch.js

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

    	/**
      * @class LogsSearch
      * @classdesc Searches the DataONE aggregated event logs. The DataONE Metrics Service has replaced
      * the DataONE event log service.
      * @deprecated
      * @classcategory Deprecated
      */
    	var LogsSearch = SearchModel.extend({
    		// This model contains all of the search/filter terms
    		/*
    		 * Search filters can be either plain text or a filter object with the following options:
    		 * filterLabel - text that will be displayed in the filter element in the UI
    		 * label - text that will be displayed in the autocomplete  list
    		 * value - the value that will be included in the query
    		 * description - a longer text description of the filter value
         * @classcategory Models
    		 */
    		defaults: function(){
    			return {
    				all: [],
    				dateLogged: [],
    				nodeId: MetacatUI.appModel.get("nodeId") || null,
    				id: [],
    				pid: [],
    				event: [],
    				userAgent: [],
    				dateAggregated: [],
    				inPartialRobotList: "false",
    				isRepeatVisit: "false",
    				isPublic: [],
    				entryId: [],
    				city: [],
    				region: [],
    				country: [],
    				location: [],
    				geohashes: [],
    				geohashLevel: 9,
    				geohashGroups: {},
    				username: [],
    				size: [],
    				formatId: [],
    				formatType: [],
    				exclude: [{
    					field: null,
    					value: null
    				}],
    				facets: [],
    				facetRanges: [],
    				facetRangeStart: function(){
    					var twentyYrsAgo = new Date();
    					twentyYrsAgo.setFullYear( twentyYrsAgo.getFullYear() - 20 );
    					return twentyYrsAgo.toISOString();
    				}(),
    				facetRangeEnd: function(){
    					var now = new Date();
    					return now.toISOString();
    				}(),
    				facetRangeGap: "%2B1MONTH",
    				facetMinCount: "1"
    			}
    		},

    		initialize: function(){
    			this.listenTo(this, "change:geohashes", this.groupGeohashes);
    		},

    		//Map the filter names to their index field names
    		fieldNameMap: {
    			all: "",
    			dateLogged: "dateLogged",
    			datasource: "nodeId",
    			nodeId: "nodeId",
    			id: "id",
    			pid: "pid",
    			event: "event",
    			userAgent: "userAgent",
    			dateAggregated: "dateAggregated",
    			isPublic: "isPublic",
    			entryId: "entryId",
    			city: "city",
    			region: "region",
    			country: "country",
    			location: "location",
    			size: "size",
    			username: "rightsHolder",
    			formatId: "formatId",
    			formatType: "formatType",
    			inPartialRobotList : "inPartialRobotList",
    			inFullRobotList : "inFullRobotList",
    			isRepeatVisit : "isRepeatVisit"
    		},

    		setNodeId: function(){
    			if(MetacatUI.nodeModel.get("currentMemberNode"))
    				this.set("nodeId", MetacatUI.nodeModel.get("currentMemberNode"));
    		},

    		/*
    		 * Get the query string based on the attributes set in this model
    		 */
    		getQuery: function(){
    			var query = "",
    				model = this;

    			var otherFilters = ["event", "formatType", "formatId", "id", "pid", "userAgent", "inPartialRobotList", "inFullRobotList", "isRepeatVisit", "dateAggregated", "dateLogged", "entryId", "city", "region", "location", "size", "username"];

    			//-------nodeId--------
    			//Update the Node Id
    			if(!this.get("nodeId"))
    				this.setNodeId();

    			if(this.filterIsAvailable("nodeId") && this.get("nodeId")){
    				var value = this.get("nodeId");

    				//Don't filter by nodeId when it is set to a CN
    				if((typeof value == "string") && (value.substr(value.lastIndexOf(":")+1, 2).toLowerCase() != "cn")){
    					//For multiple values
    					if(Array.isArray(value) && value.length){
    						query += "+" + model.getGroupedQuery(model.fieldNameMap["nodeId"], value, { operator: "OR", subtext: false });
    					}
    					else if(value && value.length){
    						// Does this need to be wrapped in quotes?
    						if(model.needsQuotes(value)) value = "%22" + encodeURIComponent(value) + "%22";
    						else value = model.escapeSpecialChar(encodeURIComponent(value));

    						query += "+" + model.fieldNameMap["nodeId"] + ":" + value;
    					}
    				}
    				else if(Array.isArray(value)){
    					query += "+" + model.getGroupedQuery(model.fieldNameMap["nodeId"], value, { operator: "OR", subtext: false });
    				}
    			}

    			//-----Other Filters/Basic Filters-----
    			_.each(otherFilters, function(filterName){
    				if(model.filterIsAvailable(filterName)){
    					var filterValue = null;
    					var filterValues = model.get(filterName);

    					//Check that this filter is set
    					if((typeof filterValues == "undefined") || !filterValues) return;

    					//For multiple values
    					if(Array.isArray(filterValues) && filterValues.length){
    						query += "+" + model.getGroupedQuery(model.fieldNameMap[filterName], filterValues, { operator: "OR", subtext: false });
    					}
    					else if(filterValues && filterValues.length){
    						// Does this need to be wrapped in quotes?
    						if(model.needsQuotes(filterValues)) filterValues = "%22" + encodeURIComponent(filterValues) + "%22";
    						else filterValues = model.escapeSpecialChar(encodeURIComponent(filterValues));

    						query += "+" + model.fieldNameMap[filterName] + ":" + filterValues;
    					}
    				}
    			});

    			return query;
    		},

    		getFacetQuery: function(){
    			var query = "&facet=true&facet.limit=-1&facet.mincount=" + this.get("facetMinCount"),
    				model = this;

    			if(typeof this.get("facets") == "string")
    				this.set("facets", [this.get("facets")]);
    			_.each(this.get("facets"), function(facetField, i, list){

    				if(model.filterIsAvailable(facetField)){
    					query += "&facet.field=" + facetField;
    				}
    			});

    			_.each(this.get("facetRanges"), function(facetField, i, list){
    				if(model.filterIsAvailable(facetField)){
    					  query += "&facet.range=" + facetField +
    					  			"&facet.range.start=" + model.get("facetRangeStart") +
    					  			"&facet.range.end=" + model.get("facetRangeEnd") +
    					  			"&facet.range.gap=" + model.get("facetRangeGap");
    					  return;
    				}
    			});

    			return query;
    		}

    	});
    	return LogsSearch;
    });