/*
 * Copyright (C) 2013 Apple Inc. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 * THE POSSIBILITY OF SUCH DAMAGE.
 */

WebInspector.ProfileManager = function()
{
    WebInspector.Object.call(this);

    this._javaScriptProfileType = new WebInspector.JavaScriptProfileType;
    this._canvasProfileType = new WebInspector.CanvasProfileType;

    ProfilerAgent.enable();
    ProfilerAgent.getProfileHeaders();

    WebInspector.Frame.addEventListener(WebInspector.Frame.Event.MainResourceDidChange, this._mainResourceDidChange, this);

    this.initialize();
};

WebInspector.ProfileManager.Event = {
    ProfileWasAdded: "profile-manager-profile-was-added",
    ProfileWasUpdated: "profile-manager-profile-was-updated",
    ProfilingStarted: "profile-manager-profiling-started",
    ProfilingEnded: "profile-manager-profiling-ended",
    ProfilingInterrupted: "profile-manager-profiling-interrupted",
    Cleared: "profile-manager-cleared"
};

WebInspector.ProfileManager.UserInitiatedProfileName = "org.webkit.profiles.user-initiated";

WebInspector.ProfileManager.prototype = {
    constructor: WebInspector.ProfileManager,

    // Public

    initialize: function()
    {
        this._checkForInterruptions();

        this._recordingJavaScriptProfile = null;
        this._recordingCanvasProfile = null;

        this._isProfiling = false;

        this.dispatchEventToListeners(WebInspector.ProfileManager.Event.Cleared);
    },

    isProfilingJavaScript: function()
    {
        return this._javaScriptProfileType.isRecordingProfile();
    },

    startProfilingJavaScript: function()
    {
        this._javaScriptProfileType.startRecordingProfile();
    },

    stopProfilingJavaScript: function()
    {
        this._javaScriptProfileType.stopRecordingProfile();
    },

    isProfilingCanvas: function()
    {
        return this._canvasProfileType.isRecordingProfile();
    },

    startProfilingCanvas: function()
    {
        this._canvasProfileType.startRecordingProfile();

        var id = this._canvasProfileType.nextProfileId();
        this._recordingCanvasProfile = new WebInspector.CanvasProfileObject(WebInspector.UIString("Canvas Profile %d").format(id), id, true);
        this.dispatchEventToListeners(WebInspector.ProfileManager.Event.ProfileWasAdded, {profile: this._recordingCanvasProfile});

        this.dispatchEventToListeners(WebInspector.ProfileManager.Event.ProfilingStarted);
    },

    stopProfilingCanvas: function()
    {
        function canvasProfilingStopped(error, profile)
        {
            if (error)
                return;

            console.assert(this._recordingCanvasProfile);

            this._recordingCanvasProfile.data = profile.data;
            this._recordingCanvasProfile.recording = false;

            this.dispatchEventToListeners(WebInspector.ProfileManager.Event.ProfileWasUpdated, {profile: this._recordingCanvasProfile});
            this.dispatchEventToListeners(WebInspector.ProfileManager.Event.ProfilingEnded, {profile: this._recordingCanvasProfile});

            this._recordingCanvasProfile = null;
        }

        this._canvasProfileType.stopRecordingProfile(canvasProfilingStopped.bind(this));
    },

    profileWasStartedFromConsole: function(title)
    {
        this.setRecordingJavaScriptProfile(true, true);

        if (title.indexOf(WebInspector.ProfileManager.UserInitiatedProfileName) === -1) {
            this._recordingJavaScriptProfile.title = title;
            this.dispatchEventToListeners(WebInspector.ProfileManager.Event.ProfileWasUpdated, {profile: this._recordingJavaScriptProfile});
        }
    },

    profileWasEndedFromConsole: function()
    {
        this.setRecordingJavaScriptProfile(false, true);
    },

    addJavaScriptProfile: function(profile)
    {
        console.assert(this._recordingJavaScriptProfile);
        if (!this._recordingJavaScriptProfile)
            return;

        this._recordingJavaScriptProfile.type = profile.typeId;
        this._recordingJavaScriptProfile.title = profile.title;
        this._recordingJavaScriptProfile.id = profile.uid;
        this._recordingJavaScriptProfile.recording = false;

        this.dispatchEventToListeners(WebInspector.ProfileManager.Event.ProfileWasUpdated, {profile: this._recordingJavaScriptProfile});

        // We want to reset _recordingJavaScriptProfile so that we can identify
        // interruptions, but we also want to keep track of the last profile
        // we've recorded so that we can provide it as data to the ProfilingEnded event
        // we'll dispatch in setRecordingJavaScriptProfile().
        this._lastJavaScriptProfileAdded = this._recordingJavaScriptProfile;
        this._recordingJavaScriptProfile = null;
    },

    setRecordingJavaScriptProfile: function(isProfiling, fromConsole)
    {
        if (this._isProfiling === isProfiling)
            return;

        this._isProfiling = isProfiling;

        // We've interrupted the current JS profile due to a page reload. Return
        // now and _attemptToResumeProfiling will pick things up after the reload.
        if (!isProfiling && !!this._recordingJavaScriptProfile)
            return;

        if (isProfiling && !this._recordingJavaScriptProfile)
            this._recordingJavaScriptProfile = new WebInspector.JavaScriptProfileObject(WebInspector.ProfileManager.UserInitiatedProfileName, -1, true);

        if (isProfiling) {
            this.dispatchEventToListeners(WebInspector.ProfileManager.Event.ProfileWasAdded, {profile: this._recordingJavaScriptProfile});
            if (!fromConsole)
                this.dispatchEventToListeners(WebInspector.ProfileManager.Event.ProfilingStarted);
        } else {
            this.dispatchEventToListeners(WebInspector.ProfileManager.Event.ProfilingEnded, {
                profile: this._lastJavaScriptProfileAdded,
                fromConsole: fromConsole
            });
            this._lastJavaScriptProfileAdded = null;
        }
    },

    // Private
    
    _mainResourceDidChange: function(event)
    {
        console.assert(event.target instanceof WebInspector.Frame);

        if (!event.target.isMainFrame())
            return;

        var oldMainResource = event.data.oldMainResource;
        var newMainResource = event.target.mainResource;
        if (oldMainResource.url !== newMainResource.url)
            this.initialize();
        else
            this._attemptToResumeProfiling();
    },

    _checkForInterruptions: function()
    {
        if (this._recordingJavaScriptProfile) {
            this.dispatchEventToListeners(WebInspector.ProfileManager.Event.ProfilingInterrupted, {profile: this._recordingJavaScriptProfile});
            this._javaScriptProfileType.setRecordingProfile(false);
        } else if (this._recordingCanvasProfile) {
            this.dispatchEventToListeners(WebInspector.ProfileManager.Event.ProfilingInterrupted, {profile: this._recordingCanvasProfile});
            this._canvasProfileType.setRecordingProfile(false);
        }
    },

    _attemptToResumeProfiling: function()
    {
        this._checkForInterruptions();

        if (this._recordingJavaScriptProfile)
            this.startProfilingJavaScript();
        else if (this._recordingCanvasProfile)
            this.startProfilingCanvas();
    }
};

WebInspector.ProfileManager.prototype.__proto__ = WebInspector.Object.prototype;
