package search

import (
	"go.skia.org/infra/go/paramtools"
	"go.skia.org/infra/go/tiling"
	"go.skia.org/infra/golden/go/types"
)

type ExpSlice []types.Expectations

func (e ExpSlice) Classification(test, digest string) types.Label {
	for _, exp := range e {
		if label := exp.Classification(test, digest); label != types.UNTRIAGED {
			return label
		}
	}
	return types.UNTRIAGED
}

// srIntermediate is the intermediate representation of a single digest
// found by the search. It is used to avoid multiple passes through the tile
// by accumulating the parameters that generated a specific digest and by
// capturing the traces.
type srIntermediate struct {
	test   string
	digest string
	traces map[string]*types.GoldenTrace
	params paramtools.ParamSet
}

// newSrIntermediate creates a new srIntermediate for a digest and adds
// the given trace to it.
func newSrIntermediate(test, digest, traceID string, trace tiling.Trace, params paramtools.ParamSet) *srIntermediate {
	ret := &srIntermediate{
		test:   test,
		digest: digest,
		params: paramtools.ParamSet{},
		traces: map[string]*types.GoldenTrace{},
	}
	ret.add(traceID, trace, params)
	return ret
}

// Add adds a new trace to an existing intermediate value for a digest
// found in search. If traceID or trace are "" or nil they will not be added.
// 'params' will always be added to the internal parameter set.
func (s *srIntermediate) add(traceID string, trace tiling.Trace, params paramtools.ParamSet) {
	if (traceID != "") && (trace != nil) {
		s.traces[traceID] = trace.(*types.GoldenTrace)
		s.params.AddParams(trace.Params())
	} else {
		s.params.AddParamSet(params)
	}
}

// srInterMap maps [testName][Digest] to an srIntermediate instance that
// aggregates values during a search.
type srInterMap map[string]map[string]*srIntermediate

// add adds the given information to the srInterMap instance.
func (sm srInterMap) add(test, digest, traceID string, trace *types.GoldenTrace, params paramtools.ParamSet) {
	if testMap, ok := sm[test]; !ok {
		sm[test] = map[string]*srIntermediate{digest: newSrIntermediate(test, digest, traceID, trace, params)}
	} else if entry, ok := testMap[digest]; !ok {
		testMap[digest] = newSrIntermediate(test, digest, traceID, trace, params)
	} else {
		entry.add(traceID, trace, params)
	}
}

// digests is mostly used for debugging and returns all digests contained in
// a collection of intermediate search results.
func (sm srInterMap) numDigests() int {
	ret := 0
	for _, digests := range sm {
		ret += len(digests)
	}
	return ret
}

// IssueSummary contains a highl level summary of a Gerrit issue.
type IssueSummary struct {
	ID          int64              `json:"id"`          // issue ID
	TimeStampMs int64              `json:"timeStampMs"` // timestamp of the last update
	PatchSets   []*PatchsetSummary `json:"patchsets"`   // patchset information
}

// PatchsetSummary contains a high level summary of a Gerrit patchset.
type PatchsetSummary struct {
	PatchsetID   int64 `json:"patchsetID"`   // id of the patchset withing the issue
	TotalJobs    int   `json:"totalJobs"`    // total number of tryjobs known to gold
	FinishedJobs int   `json:"finishedJobs"` // number of tryjobs ingested by gold
	TotalImg     int   `json:"totalImg"`     // total images created by all tryjobs
	NewImg       int   `json:"newImg"`       // number of new images (not in master)
	UntriagedImg int   `json:"untriagedImg"` // number of untriaged images (<= newImg)
}
