(function() {
	window.app.factory('inventorySvc', inventorySvc);

	inventorySvc.$inject = ['$http', '$filter'];
	function inventorySvc($http, $filter) {
		var inventories = [];

		loadInventories();

		var svc = {
			add: add,
			distribute: distribute,
			update: update,
			remove: remove,
			inventories: inventories,
			get: get,
			refresh: refresh,
			find: find
		};

		return svc;

		function loadInventories() {
			$http.post('/Inventory/All')
				.success(function(data) {
					angular.copy(data, inventories);
				});
		}

		function add(inventory) {
			return $http.post('/Inventory/Add', inventory)
				.success(function(inventory) {
					inventories.unshift(inventory);
				});
		}

		function distribute(distribution) {
			return $http.post('/Inventory/Distribute', distribution)
				.success(function (data) {
					angular.copy(data, inventories);
				});
		}

		function update(existingInventory, updatedInventory) {
			return $http.post('/Inventory/Update', updatedInventory)
				.success(function(inventory) {
					angular.extend(existingInventory, inventory);
				});
		}

		// remove quantity from this inventory
		function remove(removeForm) {
			var existingInventory = get(removeForm.inventoryId);
			return $http.post('/Inventory/Remove', removeForm)
				.success(function(data) {
					angular.copy(data, existingInventory);
				});
		}

		function get(id) {
			var results = $filter('filter')(inventories, { id: id });
			if (results.length > 0)
				return results[0];
			return null;
		}

		// refresh this inventory from the server
		function refresh(id) {
			var existingInventory = get(id);
			if (existingInventory) {
				find(id)
					.success(function(inventory) {
						angular.copy(inventory, existingInventory);
					});
			}
		}

		function find(id) {
			return $http.post('/Inventory/Find', { id: id });
		}
	}
})();