define [
], () ->
	class ReferencesManager
		constructor: (@ide, @$scope) ->

			@$scope.$root._references = @state = keys: []

			@$scope.$on 'document:closed', (e, doc) =>
				if doc.doc_id
				 	entity = @ide.fileTreeManager.findEntityById doc.doc_id
					if entity?.name?.match /.*\.bib$/
						@indexReferences([doc.doc_id], true)

			@$scope.$on 'references:should-reindex', (e, data) =>
				@indexAllReferences(true)

			# When we join the project:
			#   index all references files
			#   and don't broadcast to all clients
			@inited = false
			@$scope.$on 'project:joined', (e) =>
				# We only need to grab the references when the editor first loads,
				# not on every reconnect
				if !@inited
					@inited = true
					@indexAllReferences(false)

			setTimeout(
				(self) ->
					self.ide.socket.on 'references:keys:updated', (keys) ->
						# console.log '>> got keys from socket'
						self._storeReferencesKeys(keys)
				, 1000
				, this
			)

		_storeReferencesKeys: (newKeys) ->
			# console.log '>> storing references keys'
			oldKeys = @$scope.$root._references.keys
			@$scope.$root._references.keys = _.union(oldKeys, newKeys)

		indexReferences: (docIds, shouldBroadcast) ->
			opts =
				docIds: docIds
				shouldBroadcast: shouldBroadcast
				_csrf: window.csrfToken
			@ide.$http.post(
				"/project/#{@$scope.project_id}/references/index",
				opts
			).then (response) =>
				@_storeReferencesKeys(response.data.keys)

		indexAllReferences: (shouldBroadcast) ->
			opts =
				shouldBroadcast: shouldBroadcast
				_csrf: window.csrfToken
			@ide.$http.post(
				"/project/#{@$scope.project_id}/references/indexAll",
				opts
			).then (response) =>
				@_storeReferencesKeys(response.data.keys)
