jQuery.song = (function ($) {
    var _deferredSong,
        _options,
        self;

    function fromData(songData) {
        var s = $.extend({}, songData);

        if (s.artist) {
            s.artist = $.artist.fromData(songData.artist);
        }

        return s;
    }

    self = {
        init: function (options) {
            _options = options;
        },

        get: function (url) {
            return $.ajax({
                url:url,
                dataType:'json'
            })
            .pipe(function (songData) {
                    return fromData(songData);
            });
        },

        update: function () {
            function onSuccess(data) {
                _deferredUser.resolve(fromData(data));
            }

            function onError(xhr) {
                switch (xhr.status) {
                    case 401:
                        self.login().then(handleRequest);
                        break;
                    default:
                        _deferredUser.reject(xhr);
                }
            }

            function handleRequest() {
                $.ajax({
                    url: _options.dataHref,
                    dataType: 'json'
                })
                .then( onSuccess, onError );
            };

            if (_deferredUser && !_deferredUser.isResolved()) {
                return _deferredUser.promise();
            }
            _deferredUser = $.Deferred();

            handleRequest();

            return _deferredUser.promise();
        },

        current: function () {
            if (!_deferredUser) {
                this.update();
            }

            return _deferredUser.promise();
        }
    };

    return self;
})(jQuery);

