(function () {
    'use strict';

    var oneKeyApp = angular.module('oneKeyApp');

    oneKeyApp.service('trades', ['$resource', 'urls', function ($resource, metUrls) {

        var resource = $resource(metUrls('tradeApi').concat('/:divisionId'),
            {
                divisionId: '@divisionId'
            },
            {
                'update': { method: 'PUT' },
                'query': { method: 'GET', isArray: false }
            }
        );

        return {
            getAll: function (options, success, error) {
                return resource.query(options, success, error);
            },
            getTrade: function (tradeId, success, error) {
                return resource.get({ tradeId: tradeId }, success, error);
            },
            update: function (trade, success, error) {
                return resource.update(trade, success, error);
            },
            create: function (trade, success, error) {
                return resource.save(trade, success, error);
            },
            remove: function (trade, success, error) {
                return resource.remove({ divisionId: trade.divisionId }, success, error);
            }
        };
    }]);
}());

(function () {
    'use strict';

    var oneKeyApp = angular.module('oneKeyApp');

    oneKeyApp.controller('tradesController', ['$scope', '$filter', 'trades', 'focus', 'fadeOut', 'notify', 'localize', 'validate',
            function tradesController($scope, $filter, metTrades, metFocus, metFadeOut, metNotify, metLocalize, metValidate) {
                $scope.adding = false;
                $scope.trades = [];
                $scope.loading = true;
                $scope.new = null;
                $scope.original = null;

                $scope.add = function () {
                    _.forEach($scope.trades, function (trade) {
                        if (trade.editing) {
                            $scope.cancelEdit(trade);
                        }
                    });

                    $scope.new = {
                        divisionName: '',
                        valid: true,
                        duplicate: false
                    };

                    $scope.adding = true;
                    metFocus('focusAdd');
                };

                $scope.cancelAdd = function () {
                    $scope.new = null;
                    $scope.adding = false;
                };

                $scope.cancelEdit = function (trade) {
                    angular.copy($scope.original, trade);
                    $scope.original = null;
                    trade.editing = false;
                };

                $scope.delete = function (trade) {
                    var scope = this;
                    metTrades.remove(trade, function () {
                        //success
                        metNotify.success(messages.divisionHasBeenDeleted.value);
                        metFadeOut(scope, function () {
                            _.remove($scope.trades, trade);
                        });
                    }, function (e) {
                        //error
                        console.log(e);
                    });
                };

                $scope.edit = function (item) {
                    _.forEach($scope.trades, function (trade) {
                        if (trade.editing) {
                            $scope.cancelEdit(trade);
                        }
                    }, function (error) {
                        // TODO: handle 
                    });
                    $scope.original = angular.copy(item);
                    item.editing = true;
                    item.valid = true;
                    metFocus('focusEdit');
                };

                $scope.isEmpty = function () {
                    return _.isEmpty($scope.trades);
                };

                $scope.orderBy = function () {
                    $scope.trades = $filter('orderBy')($scope.trades, 'divisionName');
                };

                $scope.clearError = function () {
                    $scope.new.duplicate = false;
                };

                $scope.save = function () {
                    metTrades.create($scope.new, function (response) {
                        $scope.trades.push(response);
                        $scope.new = null;
                        $scope.adding = false;
                        $scope.orderBy();
                        metNotify.success(messages.divisionHasBeenAdded.value);
                    }, function (error) {
                        _.forEach($scope.trades, function (trade) {
                            if (metValidate.compareStrings($scope.new.divisionName, trade.divisionName, true, true)) {
                                $scope.new.duplicate = true;
                            }
                        });

                        $scope.new.valid = false;
                        $scope.new.error = error.data.message;
                    });
                };

                $scope.update = function (trade) {
                    metTrades.update(trade, function () {
                        $scope.original = null;
                        trade.editing = false;
                        $scope.orderBy();
                        metNotify.success(messages.divisionHasBeenSaved.value);
                    }, function (error) {
                        trade.valid = false;
                        trade.error = error.data.message;
                    });
                };

                $scope.tabIndex = function (row, column) {
                    return ((row + 1) * 3) + column;
                }

                var messages = {
                    divisionHasBeenDeleted: metLocalize('messages', 'divisionHasBeenDeleted'),
                    divisionHasBeenSaved: metLocalize('messages', 'divisionHasBeenSaved'),
                    divisionHasBeenAdded: metLocalize('messages', 'divisionHasBeenAdded')
                }

                // INIT
                metTrades.getAll(null, function (data) {
                    $scope.trades = data.items;
                    $scope.loading = false;
                    $scope.orderBy();
                }, function (error) {
                    // TODO: handle  
                    $scope.loading = false;
                });
            }]);
}());

(function () {
    'use strict';

    var oneKeyApp = angular.module('oneKeyApp');
    oneKeyApp.controller('tradesAssignController', [
        '$scope', '$timeout', '$modalInstance', '$log',
        'localize', 'focus', 'inventory', 'trades',
        'userItemIds', 'knownTrades', 'allItems', 'groupIds', 'groupType', 'searchFilters',
        function ($scope, $timeout, $modalInstance, $log,
            metLocalize, metFocus, metInventory, metTrades,
            userItemIds, knownTrades, allItems, groupIds, groupType, searchFilters) {

            $scope.userItemIds = userItemIds;
            $scope.trades = knownTrades;
            $scope.allItems = allItems;
            $scope.addMode = false;
            $scope.trade = {};
            $scope.saving = false;
            $scope.editValid = true;
            $scope.addValid = true;

            $scope.messages = {
                editDivision: metLocalize('titles', 'editDivision'),
                cancel: metLocalize('commands', 'cancel'),
                save: metLocalize('commands', 'save'),
                division: metLocalize('fieldNames', 'divisionId'),
                tradeTitle: metLocalize('fieldNames', 'divisionName'),
                pleaseSelectDivision: metLocalize('messages', 'pleaseSelectDivision'),
                select: metLocalize('fieldNames', 'select'),
                addNew: metLocalize('titles', 'addNew')
            };

            $scope.edit = function () {
                if (!$scope.selectedTrade) {
                    onEditError($scope.messages.pleaseSelectDivision.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,
                    userTradeId: $scope.selectedTrade.divisionId,
                    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;
                metTrades.create($scope.trade, function (newTrade) {
                    metInventory.bulkUpdate({
                        userItemIds: $scope.userItemIds,
                        userTradeId: newTrade.tradeId,
                        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;
            };
        }
    ]);
}());

