(function () {
    'use strict';

    var app = angular.module('oneKeyApp');

    app.service('manufacturers', ['$resource', 'urls', function ($resource, metUrls) {
        var resource = $resource(metUrls('manufacturersApi').concat('/:manufacturerId'),
            {
                manufacturerId: '@manufacturerId'
            },
            {
                'update': {
                    method: 'PUT'
                },
                'query': {
                    method: 'GET',
                    isArray: false,
                    params: {
                        'includeGlobalManufacturers': true
                    }
                }
            });

        return {
            getAll: function (success, error) {
                return resource.query(null, success, error);
            },
            get: function (manufacturerId, success, error) {
                return resource.get({ manufacturerId: manufacturerId }, success, error);
            },
            update: function (manufacturer, success, error) {
                return resource.update(manufacturer, success, error);
            },
            create: function (manufacturer, success, error) {
                return resource.save(manufacturer, success, error);
            },
            remove: function (manufacturer, success, error) {
                return resource.remove({ manufacturerId: manufacturer.manufacturerId }, success, error);
            }
        };
    }]);
}());

(function () {
    'use strict';

    var app = angular.module('oneKeyApp');

    app.controller('manufacturersController', ['$scope', '$filter', 'manufacturers', 'focus', 'fadeOut', 'notify', 'localize', 'validate',
            function ($scope, $filter, metManufacturers, metFocus, metFadeOut, metNotify, metLocalize, metValidate) {
                $scope.adding = false;
                $scope.loading = true;
                $scope.manufacturers = [];
                $scope.new = null;
                $scope.original = null;
                $scope.selected = null;

                $scope.add = function () {
                    _.forEach($scope.manufacturers, function (manufacturer) {
                        if (manufacturer.editing) {
                            $scope.cancelEdit(manufacturer);
                        }
                    });

                    $scope.new = {
                        manufacturerName: '',
                        valid: true,
                        duplicate: false
                    };
                    $scope.adding = true;
                    metFocus('focusAdd');
                };

                $scope.cancelAdd = function () {
                    $scope.new = null;
                    $scope.adding = false;
                };

                $scope.cancelEdit = function (manufacturer) {
                    angular.copy($scope.original, manufacturer);
                    $scope.original = null;
                    manufacturer.editing = false;
                };

                $scope.canDelete = function (manufacturer) {
                    return !manufacturer.isPrimary && manufacturer.itemCount === 0;
                };

                $scope.canEdit = function (manufacturer) {
                    return !manufacturer.isPrimary;
                };

                $scope.delete = function (manufacturer) {
                    var scope = this;
                    metManufacturers.remove(manufacturer, function () {
                        //success
                        metNotify.success(messages.manufacturerHasBeenDeleted.value);
                        metFadeOut(scope, function () {
                            _.remove($scope.manufacturers, manufacturer);
                        });
                    }, function (e) {
                        //error
                        console.log(e);
                    });
                };

                $scope.edit = function (item) {
                    _.forEach($scope.manufacturers, function (manufacturer) {
                        if (manufacturer.editing) {
                            $scope.cancelEdit(manufacturer);
                        }
                    });

                    $scope.original = angular.copy(item);
                    item.valid = true;
                    item.editing = true;
                    metFocus('focusEdit');
                };

                $scope.isEmpty = function () {
                    return _.isEmpty($scope.manufacturers);
                };

                $scope.orderBy = function () {
                    $scope.manufacturers = $filter('orderBy')($scope.manufacturers, 'manufacturerName');

                    var primary = _.find($scope.manufacturers, function (manufacturer) {
                        return manufacturer.isPrimary;
                    });

                    if (_.isObject(primary)) {
                        _.remove($scope.manufacturers, primary);
                        $scope.manufacturers.splice(0, 0, primary);
                    }
                };

                $scope.clearError = function () {
                    $scope.new.duplicate = false;
                };

                $scope.save = function () {
                    metManufacturers.create($scope.new, function (response) {
                        $scope.manufacturers.push(response);
                        $scope.new = null;
                        $scope.adding = false;
                        $scope.orderBy();
                        metNotify.success(messages.manufacturerHasBeenAdded.value);
                    }, function (error) {
                        _.forEach($scope.manufacturers, function (manufacturer) {
                            if (metValidate.compareStrings($scope.new.manufacturerName, manufacturer.manufacturerName, true, true)) {
                                $scope.new.duplicate = true;
                            }
                        });

                        $scope.new.valid = false;
                        $scope.new.error = error.data.message;
                    });
                };

                $scope.update = function (manufacturer) {
                    metManufacturers.update(manufacturer, function () {
                        $scope.original = null;
                        manufacturer.editing = false;
                        $scope.orderBy();
                        metNotify.success(messages.manufacturerHasBeenSaved.value);
                    }, function (error) {
                        manufacturer.valid = false;
                        manufacturer.error = error.data.message;
                    });
                };

                $scope.tabIndex = function (row, column) {
                    return ((row + 1) * 3) + column;
                }

                var messages = {
                    manufacturerHasBeenDeleted: metLocalize('messages', 'manufacturerHasBeenDeleted'),
                    manufacturerHasBeenSaved: metLocalize('messages', 'manufacturerHasBeenSaved'),
                    manufacturerHasBeenAdded: metLocalize('messages', 'manufacturerHasBeenAdded')
                }

                // INIT
                metManufacturers.getAll(function (data) {
                    $scope.manufacturers = data.items;

                    $scope.orderBy();

                    // figure out how to open the selected item.
                    if ($scope.selected) {
                        for (var i = 0; i < data.items.length; ++i) {
                            var item = data.items[i];
                            if (item.manufacturerId == $scope.selected) {
                                $scope.edit(item);
                                break;
                            }
                        }
                        $scope.selected = null;
                    }

                    $scope.loading = false;
                }, function (error) {
                    // TODO: handle  
                    $scope.loading = false;
                });
            }]);
}());

