# Source: src/js/models/connectors/Filters-Search.js

    /*global define */
    define(['backbone', "collections/Filters", "collections/SolrResults"],
      function(Backbone, Filters, SearchResults) {
      'use strict';

      /**
      * @class FiltersSearchConnector
      * @name FiltersSearchConnector
      * @classdesc A model that creates listeners between a Filters collection and a SearchResults. It does not assume anything
      * about how the search results or filters will be displayed in the UI or why those components need to be connected. It simply
      * sends a new search when the filters have been changed.
      * @name FiltersSearchConnector
      * @extends Backbone.Model
      * @constructor
      * @classcategory Models/Connectors
      */
      return Backbone.Model.extend(
        /** @lends FiltersSearchConnector.prototype */ {

            /**
             * @type {object}
             * @property {Filter[]} filtersList An array of Filter models to optionally add to the Filters collection
             * @property {Filters} filters A Filters collection to use for this search
             * @property {SolrResults} searchResults The SolrResults collection that the search results will be stored in
             */
            defaults: function(){
                return{
                    filtersList: [],
                    filters: new Filters([], { catalogSearch: true }),
                    searchResults: new SearchResults()
                }
            },

            initialize: function(){
                if( this.get("filtersList")?.length ){
                    this.get("filters").add(this.get("filtersList"))
                }
            },

            /**
             * Sets listeners on the Filters and SearchResults to trigger a search when the search changes
             * @since 2.22.0
             */
            startListening: function(){

                // Listen to changes in the Filters to trigger a search
                this.stopListening(this.get("filters"), "add remove update reset change");
                this.listenTo(this.get("filters"), "add remove update reset change", this.triggerSearch);

                //Listen to the sort order changing
                this.stopListening(this.get("searchResults"), "change:sort change:facet");
                this.listenTo(this.get("searchResults"), "change:sort change:facet", this.triggerSearch);

                //If the logged-in status changes, send a new search
                this.listenTo(MetacatUI.appUserModel, "change:loggedIn", this.triggerSearch);

            },

            /**
            * Get Results from the Solr index by combining the Filter query string fragments
            * in each Filter instance in the Search collection and querying Solr.
            * @fires SolrResults#toPage
            * @since 2.22.0
            */
            triggerSearch: function() {
                let filters = this.get("filters"),
                    searchResults = this.get("searchResults");

                // Get the Solr query string from the Search filter collection
                let query = filters.getQuery();

                // Set the query on the SolrResults collection
                searchResults.setQuery(query);

                //If the query hasn't changed since the last query that was sent, don't do anything.
                //This function may have been triggered by a change event on a filter that doesn't
                //affect the query at all
                if( !searchResults.hasChanged() ){
                    return;
                }

                // Get the page number
                let page = MetacatUI.appModel.get("page") || 0;
                searchResults.start = page * searchResults.rows;

                //Send the query to the server via the SolrResults collection
                searchResults.toPage(page);
            },
        });
    })