/**
 * Provides helper methods for invoking Studio modal windows in Jasmine tests.
 */
define(['jquery', 'common/js/components/views/feedback_notification', 'common/js/components/views/feedback_prompt',
        'common/js/spec_helpers/template_helpers'],
    function($, NotificationView, Prompt, TemplateHelpers) {
        var installViewTemplates, createFeedbackSpy, verifyFeedbackShowing,
            verifyFeedbackHidden, createNotificationSpy, verifyNotificationShowing,
            verifyNotificationHidden, createPromptSpy, confirmPrompt, inlineEdit, verifyInlineEditChange,
            installMockAnalytics, removeMockAnalytics, verifyPromptShowing, verifyPromptHidden;

        assertDetailsView = function(view, text) {
            expect(view.$el).toContainText(text);
            expect(view.$el).toContainText('ID: 0');
            expect(view.$('.delete')).toExist();
        };

        assertControllerView = function(view, detailsView, editView) {
            // Details view by default
            expect(view.$(detailsView)).toExist();
            view.$('.action-edit .edit').click();
            expect(view.$(editView)).toExist();
            expect(view.$(detailsView)).not.toExist();
            view.$('.action-cancel').click();
            expect(view.$(detailsView)).toExist();
            expect(view.$(editView)).not.toExist();
        };

        assertAndDeleteItemError = function(that, url, promptText) {
            var requests = AjaxHelpers.requests(that),
                promptSpy = ViewHelpers.createPromptSpy(),
                notificationSpy = ViewHelpers.createNotificationSpy();

            clickDeleteItem(that, promptSpy, promptText);

            patchAndVerifyRequest(requests, url, notificationSpy);

            AjaxHelpers.respondToDelete(requests);
            ViewHelpers.verifyNotificationHidden(notificationSpy);
            expect($(SELECTORS.itemView)).not.toExist();
        };

        assertAndDeleteItemWithError = function(that, url, listItemView, promptText) {
            var requests = AjaxHelpers.requests(that),
                promptSpy = ViewHelpers.createPromptSpy(),
                notificationSpy = ViewHelpers.createNotificationSpy();

            clickDeleteItem(that, promptSpy, promptText);
            patchAndVerifyRequest(requests, url, notificationSpy);

            AjaxHelpers.respondWithError(requests);
            ViewHelpers.verifyNotificationShowing(notificationSpy, /Deleting/);
            expect($(listItemView)).toExist();
        };

        assertUnusedOptions = function(that) {
            that.model.set('usage', []);
            that.view.render();
            expect(that.view.$(SELECTORS.warningMessage)).not.toExist();
            expect(that.view.$(SELECTORS.warningIcon)).not.toExist();
        };

        assertCannotDeleteUsed = function(that, toolTipText, warningText) {
            setUsageInfo(that.model);
            that.view.render();
            expect(that.view.$(SELECTORS.note)).toHaveAttr(
                'data-tooltip', toolTipText
            );
            expect(that.view.$(SELECTORS.warningMessage)).toContainText(warningText);
            expect(that.view.$(SELECTORS.warningIcon)).toExist();
            expect(that.view.$('.delete')).toHaveClass('is-disabled');
        };

        return {
            'installViewTemplates': installViewTemplates,
            'createNotificationSpy': createNotificationSpy,
            'verifyNotificationShowing': verifyNotificationShowing,
            'verifyNotificationHidden': verifyNotificationHidden,
            'confirmPrompt': confirmPrompt,
            'createPromptSpy': createPromptSpy,
            'verifyPromptShowing': verifyPromptShowing,
            'verifyPromptHidden': verifyPromptHidden,
            'inlineEdit': inlineEdit,
            'verifyInlineEditChange': verifyInlineEditChange,
            'installMockAnalytics': installMockAnalytics,
            'removeMockAnalytics': removeMockAnalytics
        };
    });