package api

import (
	"errors"
	"net/http"

	"code.google.com/p/google-api-go-client/storage/v1"
	"github.com/golang/oauth2/google"
)

var (
	ErrNoBucketSet    = errors.New("no bucket set")
	ErrNoTmpBucketSet = errors.New("no temporary bucket set")
)

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

func (c Context) Validate() error {
	if c.Bucket == "" {
		return ErrNoBucketSet
	}
	if c.TmpBucket == "" {
		return ErrNoTmpBucketSet
	}
	return nil
}

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

func NewGCSServiceStorage() (*GoogleCloudStorage, error) {
	config := google.NewComputeEngineConfig("")
	client := http.Client{Transport: config.NewTransport()}
	gcsService, err := storage.New(&client)
	if err != nil {
		return nil, err
	}
	return &GoogleCloudStorage{gcsService}, nil
}
