package api

import (
	"code.google.com/p/goauth2/oauth/jwt"
	"code.google.com/p/google-api-go-client/storage/v1beta2"
	_ "github.com/go-sql-driver/mysql"
)

type Context struct {
	Storage      Storage
	Datastore    Datastore
	UsageTracker *UsageTracker
	Bucket       string
	RootDomain   string
}

func NewMemStorage() Storage {
	return Memstorage{}
}

func NewMemDatastore() Datastore {
	return &Memstore{
		collections: map[string]Collection{},
		domains:     map[string]Domain{},
		items:       map[string]Item{},
		users:       map[string]User{},
	}
}

func NewGCSStorage(gcsClientEmail, gcsTokenURI string, gcsPemBytes []byte) (Storage, error) {
	t := jwt.NewToken(gcsClientEmail, storage.DevstorageFull_controlScope, gcsPemBytes)
	t.ClaimSet.Aud = gcsTokenURI
	transport, err := jwt.NewTransport(t)
	if err != nil {
		return nil, err
	}
	client := transport.Client()
	gcsService, err := storage.New(client)
	if err != nil {
		return nil, err
	}
	return &GoogleCloudStorage{gcsService}, nil
}
