/*
 * Copyright 2013 Google Inc.
 *
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 *
 */

#ifndef SkV8Example_Global_DEFINED
#define SkV8Example_Global_DEFINED

#include <map>

#include <v8.h>


#include "SkTypes.h"
#include "SkEvent.h"

class SkOSWindow;

typedef v8::Persistent<v8::Function, v8::CopyablePersistentTraits<v8::Function> > CopyablePersistentFn;

// Provides the global isolate and context for our V8 instance.
// Also implements all the global level functions.
class Global : SkNoncopyable  {
public:
    Global(v8::Isolate* isolate)
        : fIsolate(isolate)
        , fWindow(NULL)
        , fLastTimerID(0)
    {
        gGlobal = this;
        this->initialize();
    }
    virtual ~Global() {}

    // The script will be parsed into the context this Global contains.
    bool parseScript(const char script[]);

    v8::Local<v8::Context> getContext() {
        return v8::Local<v8::Context>::New(fIsolate, fContext);
    }

    v8::Isolate* getIsolate() {
        return fIsolate;
    }

    void setWindow(SkOSWindow* win) {
        fWindow = win;
    }
    SkOSWindow* getWindow() {
        return fWindow;
    }

    void reportException(v8::TryCatch* tryCatch);

private:
    void initialize();
    v8::Handle<v8::Context> createRootContext();
    int32_t getNextTimerID();

    static bool TimeOutProc(const SkEvent& evt);

    // Static functions that implement the global JS functions we add to
    // the context.
    static void SetTimeout(const v8::FunctionCallbackInfo<v8::Value>& args);
    static void Print(const v8::FunctionCallbackInfo<v8::Value>& args);
    static void Inval(const v8::FunctionCallbackInfo<v8::Value>& args);

    v8::Persistent<v8::Context> fContext;
    v8::Isolate*                fIsolate;
    SkOSWindow*                 fWindow;
    static Global*              gGlobal;

    // Handle to the functions to call when a timeout triggers as indexed by id.
    std::map<int32_t, CopyablePersistentFn > fTimeouts;

    // Last timer ID generated.
    int32_t fLastTimerID;
};

#endif