// Copyright 2022 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 main

import (
	buildbucketpb "go.chromium.org/luci/buildbucket/proto"
	resultpb "go.chromium.org/luci/resultdb/proto/v1"
)

// failureSignature represents a single failure mode of a Buildbucket build,
// used for clustering builds to identify common failure modes.
//
// A single build might have multiple failure signatures.
type failureSignature struct {
	FailedTest    string `json:"failed_test"`
	FailureReason string `json:"failure_reason"`

	// TestGNLabel is the GN label of the failed test. It might be empty.
	//
	// TODO(olivernewman): GN label is just metadata and shouldn't be used for
	// clustering. Figure out a way to avoid considering the GN label when
	// grouping failed builds by failure mode; if a test gets moved from one GN
	// label to another we shouldn't consider that a separate test.
	TestGNLabel string `json:"gn_label"`

	// TODO(olivernewman): also cluster by build summary text as a fallback.
}

// buildResult is a convenience type for bundling together the metadata of a
// build with the failed test results.
type buildResult struct {
	Build       *buildbucketpb.Build
	FailedTests []*resultpb.TestResult
}

func (b buildResult) integrationRevisionCount() (int, bool) {
	outputProps := b.Build.Output.Properties.AsMap()
	count, ok := outputProps["integration-revision-count"]
	if !ok {
		return 0, false
	}
	return int(count.(float64)), true
}

// culpritFeature represents a numerical feature used to estimate a potential
// culprit change's likelihood of causing a given failure mode.
type culpritFeature struct {
	Name   string `json:"name"`
	Score  int    `json:"score"`
	Weight int    `json:"weight"`
}
