// Copyright 2015 The LUCI Authors.
//
// 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 coordinator

import (
	"go.chromium.org/luci/auth"
	"go.chromium.org/luci/grpc/prpc"
	logdog "go.chromium.org/luci/logdog/api/endpoints/coordinator/logs/v1"
	"go.chromium.org/luci/logdog/common/types"
)

var (
	// Scopes is the set of scopes needed for the Coordinator user endpoints.
	Scopes = []string{
		auth.OAuthScopeEmail,
	}
)

// Client wraps a Logs client with user-friendly methods.
//
// Each method should operate independently, so calling methods from different
// goroutines must not cause any problems.
type Client struct {
	// C is the underlying LogsClient interface.
	C logdog.LogsClient
	// Host is the LogDog host. This is loaded from the pRPC client in NewClient.
	Host string
}

// NewClient returns a new Client instance bound to a pRPC Client.
func NewClient(c *prpc.Client) *Client {
	return &Client{
		C:    logdog.NewLogsPRPCClient(c),
		Host: c.Host,
	}
}

// Stream returns a Stream instance for the named stream.
func (c *Client) Stream(project string, path types.StreamPath) *Stream {
	return &Stream{
		c:       c,
		project: project,
		path:    path,
	}
}
