/* global jasmine */

'use strict';

(function(jasmine, beforeEach) {

    var sinon = (typeof require === 'function' && typeof module === 'object') ? require('sinon') : window.sinon,
        spyMatchers = 'called calledOnce calledTwice calledThrice calledBefore calledAfter calledOn alwaysCalledOn calledWith alwaysCalledWith calledWithExactly alwaysCalledWithExactly calledWithMatch alwaysCalledWithMatch'.split(' '),
        i = spyMatchers.length,
        spyMatcherHash = {},
        unusualMatchers = {
            "returned": "toHaveReturned",
            "alwaysReturned": "toHaveAlwaysReturned",
            "threw": "toHaveThrown",
            "alwaysThrew": "toHaveAlwaysThrown"
        },

        createCustomMatcher = function(arg) {
            return sinon.match(function (val) {
                return jasmine.getEnv().equals_(val, arg);
            });
        },

        getMatcherFunction = function(sinonName, matcherName) {
            var original = jasmine.Matchers.prototype[matcherName];
            return function () {
                if (jasmine.isSpy(this.actual) && original) {
                    return original.apply(this, arguments);
                }
                var sinonProperty = this.actual[sinonName];
                var args = Array.prototype.slice.call(arguments);

                for (var i = 0; i < args.length; i++) {
                    if (args[i] && (typeof args[i].jasmineMatches === 'function' || args[i] instanceof jasmine.Matchers.ObjectContaining)) {
                        args[i] = createCustomMatcher(args[i]);
                    }
                }

                return (typeof sinonProperty === 'function') ? sinonProperty.apply(this.actual, args) : sinonProperty;
            };
        };

    while(i--) {
        var sinonName = spyMatchers[i],
            matcherName = "toHaveBeen" + sinonName.charAt(0).toUpperCase() + sinonName.slice(1);

        spyMatcherHash[matcherName] = getMatcherFunction(sinonName, matcherName);
    }

    for (var j in unusualMatchers) {
        spyMatcherHash[unusualMatchers[j]] = getMatcherFunction(j, unusualMatchers[j]);
    }

    beforeEach(function() {
        this.addMatchers(spyMatcherHash);
    });

})(jasmine, beforeEach);