(function(angular) {
  'use strict';

  var moduleName = '{{ngModule}}';

  angular
    .module(moduleName, ['ngResource'])
    .provider('$resourceActionConfig', function () {
      var actionConfigs = {$global: {}};

      this.addActionConfig = function (resourceName, actionName, config) {
        if (arguments.length === 1) {
          actionConfigs.$global = resourceName; // resourceName === config
          return this;
        } else if (arguments.length === 2) {
          config = actionName;
          actionName = '$global';
        }

        actionConfigs[resourceName] = actionConfigs[resourceName] || {};
        actionConfigs[resourceName][actionName] = config;
        return this;
      };

      this.$get = function () {
        return function (resourceName, actionName) {
          return actionConfigs[resourceName]
            ? (actionConfigs[resourceName][actionName] || actionConfigs[resourceName].$global)
            : actionConfigs.$global;
        };
      };
    })
    {{#each resourceOperations}}
    .{{../angularProviderType}}('{{capitalize @key}}{{../angularProviderSuffix}}', function() {
      {{#if ../ngdoc}}
      /**
      * @ngdoc service
      * @name {{../../ngModule}}.{{capitalize @key}}{{../angularProviderSuffix}}
      * @requires $resource
      * @requires apiUrl
      **/
      {{/if}}
      this.$get = function($resource, apiUrl, $resourceActionConfig) {
        return $resource(null, null, {
          {{#each this}}
          {{#if ../../ngdoc}}
          /**
          * @ngdoc method
          * @name {{../../../ngModule}}.{{capitalize @key}}{{../../../angularProviderSuffix}}.method:{{camelize nickname}}
          * @methodOf {{../../../ngModule}}.{{capitalize @key}}{{../../../angularProviderSuffix}}
          * @description
          * {{summary}}
          **/
          {{/if}}
          '{{camelize nickname}}': angular.extend({
            method: '{{action}}',
            url: apiUrl + '{{path}}',
            {{#if pathParameters}}
            params: {
              {{#each pathParameters}}
              '{{name}}': '@{{name}}',
              {{/each}}
            },
            {{/if}}
            {{#isQuery}}
            isArray: true,
            {{/isQuery}}
          }, $resourceActionConfig('{{@key}}', '{{camelize nickname}}')),
          {{/each}}
        });
      };
    })
    {{/each}};

    if (typeof exports !== 'undefined') {
        if (typeof module !== 'undefined' && module.exports) {
            exports = module.exports = moduleName;
        }
        exports = moduleName;
    }
}(angular));
