this.jetpackModules = this.jetpackModules || {};

window.jetpackModules.views = ( function ( window, $, _, Backbone, wp ) {
	'use strict';

	var views = {};

	views.List_Table = Backbone.View.extend( {
		template: wp.template( 'Jetpack_Modules_List_Table_Template' ),

		/**
		 * If we can, use replaceState to change the URL and indicate the new filtering.
		 * This will be handy with redirecting back to the same state after activating/deactivating.
		 */
		updateUrl: function () {
			if ( ! window.history.replaceState ) {
				return;
			}

			var url = window.location.href.split( '?' )[ 0 ] + '?page=jetpack_modules',
				m_tag = $( '.subsubsub .current' ),
				m_filter = $( '.button-group.filter-active .active' ),
				m_sort = $( '.button-group.sort .active' ),
				m_search = $( '#srch-term-search-input' ).val();

			if ( m_search.length ) {
				url += '&s=' + encodeURIComponent( m_search );
			}

			if ( ! m_tag.hasClass( 'all' ) ) {
				url += '&module_tag=' + encodeURIComponent( m_tag.data( 'title' ) );
			}

			if ( m_filter.data( 'filter-by' ) ) {
				url +=
					'&' +
					encodeURIComponent( m_filter.data( 'filter-by' ) ) +
					'=' +
					encodeURIComponent( m_filter.data( 'filter-value' ) );
			}

			if ( 'name' !== m_sort.data( 'sort-by' ) ) {
				url += '&sort_by=' + encodeURIComponent( m_sort.data( 'sort-by' ) );
			}

			window.history.replaceState( {}, '', url );
		},

		render: function () {
			this.model.filter_and_sort();
			this.$el.html( this.template( this.model.attributes ) );
			this.updateUrl();
			return this;
		},

		initialize: function () {
			this.listenTo( this.model, 'change', this.render );
		},
	} );

	return views;
} )( this, jQuery, _, Backbone, wp );
