// Copyright 2016 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package cloud_test

import (
	"io/ioutil"
	"log"

	"cloud.google.com/go/pubsub"
	"golang.org/x/net/context"
	"golang.org/x/oauth2/google"
	"google.golang.org/api/option"
)

func Example_createClientWithApplicationDefaultCredentials(ctx context.Context) *pubsub.Client {
	// Create a pubsub Client to demonstrate using Application Default
	// Credentials for authentication.
	//
	// Application Default Credentials provide a simple way to get
	// authorization credentials for use in calling Google APIs.  They are
	// best suited for cases when the call needs to have the same identity
	// and authorization level for the application independent of the user.
	// This is the recommended approach to authorize calls to Google Cloud
	// APIs, particularly when you're building an application that is
	// deployed to Google App Engine or Google Compute Engine virtual
	// machines.
	// See
	// https://developers.google.com/identity/protocols/application-default-credentials
	// for more information.
	//
	// The same approach may be used to construct Clients from other
	// packages, e.g. bigtable, datastore.
	client, err := pubsub.NewClient(ctx, "project-id")
	if err != nil {
		log.Fatal("new client:", err)
	}

	return client
}

func Example_createClientWithTokenSource(ctx context.Context) *pubsub.Client {
	jsonKey, err := ioutil.ReadFile("/path/to/json/keyfile.json")
	if err != nil {
		log.Fatal(err)
	}
	conf, err := google.JWTConfigFromJSON(
		jsonKey,
		pubsub.ScopeCloudPlatform,
		pubsub.ScopePubSub,
	)

	if err != nil {
		log.Fatal(err)
	}
	ts := conf.TokenSource(ctx)

	// Create a pubsub Client to demonstrate using an OAuth2 token source
	// for authentication.  The same approach may be used to construct
	// Clients from other packages, e.g. bigtable, datastore.
	client, err := pubsub.NewClient(ctx, "project-id", option.WithTokenSource(ts))
	if err != nil {
		log.Fatal("new client:", err)
	}

	return client
}
