// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package resultstore

import (
	"context"
	"crypto/x509"
	"fmt"

	api "google.golang.org/genproto/googleapis/devtools/resultstore/v2"
	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials"
)

const (
	// Google Cloud API scope required to use ResultStore Upload API.
	scope = "https://www.googleapis.com/auth/cloud-platform"
)

// Connect returns a new UploadClient connected to the ResultStore backend at the given host.
func Connect(ctx context.Context, environment Environment, creds credentials.PerRPCCredentials) (*UploadClient, error) {
	pool, err := x509.SystemCertPool()
	if err != nil {
		return nil, fmt.Errorf("failed to create cert pool: %v", err)
	}

	transportCreds := credentials.NewClientTLSFromCert(pool, "")

	conn, err := grpc.Dial(
		environment.GRPCServiceAddress(),
		grpc.WithTransportCredentials(transportCreds),
		grpc.WithPerRPCCredentials(creds),
	)
	if err != nil {
		return nil, err
	}
	return NewUploadClient(api.NewResultStoreUploadClient(conn)), nil
}

// Environment describes which ResultStore environment to use.
type Environment string

// Environment constants.
const (
	Production Environment = "production"
	Staging    Environment = "staging"
)

// Returns the URL of the Invocation with the given ID in this Environment.
func (e Environment) InvocationURL(invocationID string) string {
	return fmt.Sprintf("https://%s/results/invocations/%s/targets", e.frontendHostname(), invocationID)
}

// FrontendHostname is the hostname of the ResultStore UI for this Environment.
func (e Environment) frontendHostname() string {
	switch e {
	case Production:
		return "source.cloud.google.com"
	case Staging:
		return "grimoire-stagingprod.corp.google.com"
	default:
		// We should never get here.
		panic("invalid environment: " + e)
	}
}

// GRPCServiceAddress is the address of the ResultStoreUpload gRPC service.
func (e Environment) GRPCServiceAddress() string {
	switch e {
	case Production:
		return "resultstore.googleapis.com:443"
	case Staging:
		return "staging-resultstore.googleapis.com:443"
	default:
		// We should never get here.
		panic("invalid environment: " + e)
	}
}
