// 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 result

type ResultConfig struct {
	FuchsiaDir           string      `json:"fuchsiaDir"`
	Target               string      `json:"target"`
	SPDXDocName          string      `json:"spdxDocName"`
	OutDir               string      `json:"outDir"`
	RootOutDir           string      `json:"rootOutDir"`
	LicenseOutDir        string      `json:"licenseOutDir"`
	Outputs              []string    `json:"outputs"`
	Templates            []*Template `json:"templates"`
	Zip                  bool        `json:"zip"`
	GnGenOutputFile      string      `json:"gnGenOutputFile"`
	OutputLicenseFile    bool        `json:"outputLicenseFile"`
	RunAnalysis          bool        `json:"runAnalysis"`
	OverwriteReadmeFiles bool        `json:"overwriteReadmeFiles"`

	Checks    []*Check `json:"checks"`
	CheckURLs bool

	AllowLists []*AllowList `json::allowlists"`
}

type Template struct {
	Paths []string `json:"paths"`
	Notes []string `json:"notes"`
}

type AllowList struct {
	Name      string            `json:"name"`
	MatchType string            `json:"matchType"`
	Entries   []*AllowListEntry `json:"entries"`
}

type AllowListEntry struct {
	Projects []string `json:"projects"`
	Bug      string   `json:"bug"`
	Notes    []string `json:"notes"`
}

var Config *ResultConfig

func NewConfig() *ResultConfig {
	return &ResultConfig{
		Outputs:           make([]string, 0),
		Templates:         make([]*Template, 0),
		Checks:            make([]*Check, 0),
		AllowLists:        make([]*AllowList, 0),
		OutputLicenseFile: false,
		RunAnalysis:       false,
	}
}

func (c *ResultConfig) Merge(other *ResultConfig) {
	if c.FuchsiaDir == "" {
		c.FuchsiaDir = other.FuchsiaDir
	}
	if c.Target == "" {
		c.Target = other.Target
	}
	if c.RootOutDir == "" {
		c.RootOutDir = other.RootOutDir
	}
	if c.OutDir == "" {
		c.OutDir = other.OutDir
	}
	if c.LicenseOutDir == "" {
		c.LicenseOutDir = other.LicenseOutDir
	}
	c.Templates = append(c.Templates, other.Templates...)
	c.Outputs = append(c.Outputs, other.Outputs...)
	c.Zip = c.Zip || other.Zip
	if c.GnGenOutputFile == "" {
		c.GnGenOutputFile = other.GnGenOutputFile
	}
	c.OutputLicenseFile = c.OutputLicenseFile || other.OutputLicenseFile
	c.RunAnalysis = c.RunAnalysis || other.RunAnalysis
	if c.SPDXDocName == "" {
		c.SPDXDocName = other.SPDXDocName
	}
	c.Checks = append(c.Checks, other.Checks...)
	c.CheckURLs = c.CheckURLs || other.CheckURLs
	c.OverwriteReadmeFiles = c.OverwriteReadmeFiles || other.OverwriteReadmeFiles

	c.AllowLists = append(c.AllowLists, other.AllowLists...)
}
