(function () {
    'use strict';

    var oneKeyApp = angular.module('oneKeyApp');

    oneKeyApp.service('people', ['$resource', 'urls', function ($resource, metUrls) {

        var resource = $resource(metUrls('peopleApi').concat('/:personId'),
            {
                personId: '@personId'
            },
            {
                'update': { method: 'PUT' },
                'query': { method: 'GET', isArray: false }
            }
        );

        return {
            getAll: function (options, success, error) {
                return resource.query(options, success, error);
            },
            getPerson: function (personId, success, error) {
                return resource.get({ personId: personId }, success, error);
            },
            update: function (person, success, error) {
                return resource.update(person, success, error);
            },
            create: function (person, success, error) {
                return resource.save(person, success, error);
            },
            remove: function (person, success, error) {
                return resource.remove({ personId: person.personId }, success, error);
            }
        };
    }]);
}());

angular
  .module('app', ['ngMessages'])
  .controller('MainCtrl', MainCtrl);

function MainCtrl() {

}
(function () {
    'use strict';

    var oneKeyApp = angular.module('oneKeyApp');

    oneKeyApp.controller('peopleController', ['$scope', '$filter', 'people', 'focus', 'fadeOut', 'notify', 'localize', 'validate',
            function peopleController($scope, $filter, metPeople, metFocus, metFadeOut, metNotify, metLocalize, metValidate) {
                $scope.adding = false;
                $scope.people = [];
                $scope.loading = true;
                $scope.new = null;
                $scope.original = null;

                $scope.add = function () {
                    _.forEach($scope.people, function (person) {
                        if (person.editing) {
                            $scope.cancelEdit(person);
                        }
                    });

                    $scope.new = {
                        personName: '',
                        valid: true,
                        duplicate: false
                    };

                    $scope.adding = true;
                    metFocus('focusAdd');
                };

                $scope.cancelAdd = function () {
                    $scope.new = null;
                    $scope.adding = false;
                };

                $scope.cancelEdit = function (person) {
                    angular.copy($scope.original, person);
                    $scope.original = null;
                    person.editing = false;
                };

                $scope.delete = function (person) {
                    var scope = this;
                    metPeople.remove(person, function () {
                        //success
                        metNotify.success(messages.personHasBeenDeleted.value);
                        metFadeOut(scope, function () {
                            _.remove($scope.people, person);
                        });
                    }, function (e) {
                        //error
                        console.log(e);
                    });
                };

                $scope.edit = function (item) {
                    _.forEach($scope.people, function (person) {
                        if (person.editing) {
                            $scope.cancelEdit(person);
                        }
                    }, function (error) {
                        // TODO: handle 
                    });
                    $scope.original = angular.copy(item);
                    item.editing = true;
                    item.valid = true;
                    metFocus('focusEdit');
                };

                $scope.isEmpty = function () {
                    return _.isEmpty($scope.people);
                };

                $scope.orderBy = function () {
                    $scope.people = $filter('orderBy')($scope.people, 'personName');
                };

                $scope.clearError = function () {
                    $scope.new.duplicate = false;
                };

                $scope.save = function () {
                    metPeople.create($scope.new, function (response) {
                        $scope.people.push(response);
                        $scope.new = null;
                        $scope.adding = false;
                        $scope.orderBy();
                        metNotify.success(messages.personHasBeenAdded.value);
                    }, function (error) {
                        _.forEach($scope.people, function (person) {
                            if (metValidate.compareStrings($scope.new.personName, person.personName, true, true)) {
                                $scope.new.duplicate = true;
                            }
                        });

                        $scope.new.valid = false;
                        $scope.new.error = error.data.message;
                    });
                };

                $scope.update = function (person) {
                    metPeople.update(person, function () {
                        $scope.original = null;
                        person.editing = false;
                        $scope.orderBy();
                        metNotify.success(messages.personHasBeenSaved.value);
                    }, function (error) {
                        person.valid = false;
                        person.error = error.data.message;
                    });
                };

                $scope.tabIndex = function (row, column) {
                    return ((row + 1) * 3) + column;
                }

                var messages = {
                    personHasBeenDeleted: metLocalize('messages', 'personHasBeenDeleted'),
                    personHasBeenSaved: metLocalize('messages', 'personHasBeenSaved'),
                    personHasBeenAdded: metLocalize('messages', 'personHasBeenAdded')
                }

                // INIT
                metPeople.getAll(null, function (data) {
                    $scope.people = data.items;
                    $scope.loading = false;
                    $scope.orderBy();
                }, function (error) {
                    // TODO: handle  
                    $scope.loading = false;
                });
            }]);


}());

(function () {
	'use strict';

	var oneKeyApp = angular.module('oneKeyApp');
	oneKeyApp.controller('peopleAssignController', [
        '$scope', '$timeout', '$modalInstance', '$log',
        'localize', 'focus', 'inventory', 'people',
        'userItemIds', 'knownPeople', 'allItems', 'groupIds', 'groupType', 'searchFilters',
        function ($scope, $timeout, $modalInstance, $log,
            metLocalize, metFocus, metInventory, metPeople,
            userItemIds, knownPeople, allItems, groupIds, groupType, searchFilters) {

        	$scope.userItemIds = userItemIds;
        	$scope.people = knownPeople;
        	$scope.allItems = allItems;
        	$scope.addMode = false;
        	$scope.person = {};
        	$scope.saving = false;
        	$scope.editValid = true;
        	$scope.addValid = true;

        	$scope.messages = {
        		editPerson: metLocalize('titles', 'editPerson'),
        		cancel: metLocalize('commands', 'cancel'),
        		save: metLocalize('commands', 'save'),
        		person: metLocalize('fieldNames', 'personId'),
        		personTitle: metLocalize('fieldNames', 'personName'),
        		pleaseSelectPerson: metLocalize('messages', 'pleaseSelectPerson'),
        		select: metLocalize('fieldNames', 'select'),
        		addNew: metLocalize('titles', 'addNew')
        	};

        	$scope.edit = function () {
        		if (!$scope.selectedPerson) {
        			onEditError($scope.messages.pleaseSelectPerson.value);
        			return;
        		}

        		// send no item id's if allItems is set to true (to make a smaller/faster request)
        		var userItemIds = allItems ? [] : $scope.userItemIds;

        		$scope.saving = true;
        		metInventory.bulkUpdate({
        			userItemIds: $scope.userItemIds,
        			userPersonId: $scope.selectedPerson.personId,
        			updateAllUserItems: allItems,
        			groupIds: groupIds,
                    groupType: groupType,
        			filters: searchFilters,

        		}, function (result) {
        			if (!result.isValid) {
        				onEditError(result.message);
        			} else {
        				$modalInstance.close();
        			}
        		}, function (error) {
        			onEditError(error.data.message);
        		});
        	};

        	var onEditError = function (message) {
        		$scope.saving = false;
        		$scope.editValid = false;
        		$scope.editError = message;
        	};

        	$scope.add = function () {
        		$scope.saving = true;
        		metPeople.create($scope.person, function (newPerson) {
        			metInventory.bulkUpdate({
        				userItemIds: $scope.userItemIds,
        				userPersonId: newPerson.personId,
        				updateAllUserItems: allItems,
        				groupIds: groupIds,
        				groupType: groupType,
        				filters: searchFilters,
        			}, function (result) {
        				if (!result.isValid) {
        					onAddError(result.message);
        				} else {
        					$modalInstance.close();
        				}
        			}, function (error) {
        				onAddError(error.data.message);
        			});
        		}, function (error) {
        			onAddError(error.data.message);
        		});
        	};

        	var onAddError = function (message) {
        		$scope.saving = false;
        		$scope.addValid = false;
        		$scope.addError = message;
        	};

        	$scope.cancel = function () {
        		$modalInstance.dismiss('cancel');
        	};

        	$scope.toggleMode = function () {
        		$scope.addMode = true;
        	};
        }
	]);
}());

