// Copyright 2022 The Dawn 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 common

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io/ioutil"
	"time"

	"dawn.googlesource.com/dawn/tools/src/buildbucket"
	"github.com/tidwall/jsonc"
)

// Config holds the configuration data for the 'cts' command.
// Config is loaded from a JSON file stored next to the
// tools/src/cmd/cts/config.json.
type Config struct {
	// Test holds configuration data for test results.
	Test struct {
		// The ResultDB string prefix for CTS tests.
		Prefixes []string
		// The time threshold used to classify tests as slow.
		SlowThreshold time.Duration
	}
	// Gerrit holds configuration for Dawn's Gerrit server.
	Gerrit struct {
		// The host URL
		Host string
		// The project name
		Project string
	}
	// Git holds configuration data for the various Git repositories.
	Git struct {
		// The CTS git repository.
		CTS GitProject
		// The Dawn git repository.
		Dawn GitProject
	}
	// Builders is a map of builder name (as displayed in the UI) to buildbucket
	// builder information.
	Builders map[string]buildbucket.Builder
	// Tags holds configuration data for cleaning result tags before processing
	Tag struct {
		// Remove holds tags that should be removed before processing.
		// See crbug.com/dawn/1401 for more information.
		Remove []string
	}
	// Sheets holds information about the Google Sheets document used for
	// tracking CTS statistics.
	Sheets struct {
		ID string
	}
}

// GitProject holds a git host URL and project.
type GitProject struct {
	Host    string
	Project string
}

// HttpsURL returns the https URL of the project
func (g GitProject) HttpsURL() string {
	return fmt.Sprintf("https://%v/%v", g.Host, g.Project)
}

// LoadConfig loads the JSON config file at the given path
func LoadConfig(path string) (*Config, error) {
	data, err := ioutil.ReadFile(path)
	if err != nil {
		return nil, fmt.Errorf("failed to open '%v': %w", path, err)
	}

	// Remove comments, trailing commas.
	data = jsonc.ToJSONInPlace(data)

	cfg := Config{}
	if err := json.NewDecoder(bytes.NewReader(data)).Decode(&cfg); err != nil {
		return nil, fmt.Errorf("failed to load config: %w", err)
	}
	return &cfg, nil
}
