// Copyright 2019 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 build

import (
	"path/filepath"

	"golang.org/x/exp/maps"
	"golang.org/x/exp/slices"
)

const (
	imageManifestName = "images"
)

// Modules is a convenience interface for accessing the various build API
// modules associated with a build.
//
// For information about each build API module, see the corresponding
// `build_api_module` target in //BUILD.gn.
type Modules struct {
	buildDir string
	// keep-sorted start
	apis                     []string
	archives                 []Archive
	args                     Args
	assemblyInputArchives    []AssemblyInputArchive
	assemblyManifests        []AssemblyManifest
	binaries                 []Binary
	checkoutArtifacts        []CheckoutArtifact
	clippyTargets            []ClippyTarget
	generatedSources         []string
	images                   []Image
	licenses                 []License
	packageRepositories      []PackageRepo
	platforms                []DimensionSet
	prebuiltBinarySets       []PrebuiltBinarySet
	productBundles           []ProductBundle
	productSizeCheckerOutput []ProductSizeCheckerOutput
	sdkArchives              []SDKArchive
	testDurations            []TestDuration
	testListLocation         []string
	testSpecs                []TestSpec
	tools                    Tools
	// keep-sorted end
}

// NewModules returns a Modules associated with a given build directory.
func NewModules(buildDir string) (*Modules, error) {
	m := &Modules{buildDir: buildDir}

	buildApiClient, err := NewBuildAPIClient(buildDir)
	if err != nil {
		return nil, err
	}

	manifests := map[string]interface{}{
		// keep-sorted start ignore_prefixes="
		"api":                         &m.apis,
		"archives":                    &m.archives,
		"args":                        &m.args,
		"assembly_input_archives":     &m.assemblyInputArchives,
		"assembly_manifests":          &m.assemblyManifests,
		"binaries":                    &m.binaries,
		"checkout_artifacts":          &m.checkoutArtifacts,
		"clippy_target_mapping":       &m.clippyTargets,
		"generated_sources":           &m.generatedSources,
		imageManifestName:             &m.images,
		"licenses":                    &m.licenses,
		"package-repositories":        &m.packageRepositories,
		"platforms":                   &m.platforms,
		"prebuilt_binaries":           &m.prebuiltBinarySets,
		"product_bundles":             &m.productBundles,
		"product_size_checker_output": &m.productSizeCheckerOutput,
		"sdk_archives":                &m.sdkArchives,
		"test_durations":              &m.testDurations,
		"test_list_location":          &m.testListLocation,
		"tests":                       &m.testSpecs,
		"tool_paths":                  &m.tools,
		// keep-sorted end
	}
	// Ensure we read the manifests in order, so that if multiple manifests are
	// missing we always get the same error.
	manifestNames := maps.Keys(manifests)
	slices.Sort(manifestNames)
	for _, manifest := range manifestNames {
		if err := buildApiClient.GetJSON(manifest, manifests[manifest]); err != nil {
			return nil, err
		}
	}
	return m, nil
}

// BuildDir returns the fuchsia build directory root.
func (m Modules) BuildDir() string {
	return m.buildDir
}

// ImageManifest returns the path to the images manifest.
func (m Modules) ImageManifest() string {
	return filepath.Join(m.BuildDir(), imageManifestName+".json")
}

// APIs returns the build API module of available build API modules.
func (m Modules) APIs() []string {
	return m.apis
}

func (m Modules) Archives() []Archive {
	return m.archives
}

func (m Modules) Args() Args {
	return m.args
}

func (m Modules) AssemblyInputArchives() []AssemblyInputArchive {
	return m.assemblyInputArchives
}

func (m Modules) AssemblyManifests() []AssemblyManifest {
	return m.assemblyManifests
}

func (m Modules) Binaries() []Binary {
	return m.binaries
}

func (m Modules) CheckoutArtifacts() []CheckoutArtifact {
	return m.checkoutArtifacts
}

func (m Modules) ClippyTargets() []ClippyTarget {
	return m.clippyTargets
}

func (m Modules) GeneratedSources() []string {
	return m.generatedSources
}

func (m Modules) Images() []Image {
	return m.images
}

func (m Modules) Licenses() []License {
	return m.licenses
}

func (m Modules) PackageRepositories() []PackageRepo {
	return m.packageRepositories
}

// Platforms returns the build API module of available platforms to test on.
func (m Modules) Platforms() []DimensionSet {
	return m.platforms
}

// PrebuiltBinarySets returns the build API module of prebuilt packages
// registered in the build.
func (m Modules) PrebuiltBinarySets() []PrebuiltBinarySet {
	return m.prebuiltBinarySets
}

func (m Modules) ProductSizeCheckerOutput() []ProductSizeCheckerOutput {
	return m.productSizeCheckerOutput
}

func (m Modules) ProductBundles() []ProductBundle {
	return m.productBundles
}

func (m Modules) SDKArchives() []SDKArchive {
	return m.sdkArchives
}

func (m Modules) TestDurations() []TestDuration {
	return m.testDurations
}

func (m Modules) TestListLocation() []string {
	return m.testListLocation
}

func (m Modules) TestSpecs() []TestSpec {
	return m.testSpecs
}

func (m Modules) Tools() Tools {
	return m.tools
}
