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

// perf runs an HTTP server for benchmark analysis.
package main

import (
	"context"
	"flag"
	"log"
	"net/http"
	"os"

	"golang.org/x/build/internal/https"
	"golang.org/x/build/perf/app"
	"golang.org/x/build/perfdata"
)

var (
	perfdataURL   = flag.String("perfdata", "https://perfdata.golang.org", "perfdata server base `url`")
	influxHost    = flag.String("influx-host", os.Getenv("INFLUX_HOST"), "URL of the InfluxDB instance")
	influxToken   = flag.String("influx-token", os.Getenv("INFLUX_TOKEN"), "Authentication token for the InfluxDB instance")
	influxProject = flag.String("influx-project", os.Getenv("INFLUX_PROJECT"), "GCP project ID for the InfluxDB instance. If empty, defaults to the project this service is running as. If -influx-token is not set, the token is fetched from Secret Manager in the project.")
	authCronEmail = flag.String("auth-cron-email", "", "If set, requests to /cron/syncinflux must be authenticated as the passed service account.")
)

func main() {
	https.RegisterFlags(flag.CommandLine)
	flag.Parse()

	app := &app.App{
		StorageClient: &perfdata.Client{BaseURL: *perfdataURL},
		InfluxHost:    *influxHost,
		InfluxToken:   *influxToken,
		InfluxProject: *influxProject,
		AuthCronEmail: *authCronEmail,
	}
	mux := http.NewServeMux()
	app.RegisterOnMux(mux)

	log.Printf("Serving...")

	ctx := context.Background()
	log.Fatal(https.ListenAndServe(ctx, mux))
}
