package sourceanalysis

import (
	"path/filepath"

	"github.com/google/osv-scanner/v2/pkg/models"
	"github.com/ossf/osv-schema/bindings/go/osvschema"
)

// vulnsFromAllPkgs returns the flattened list of unique vulnerabilities
func vulnsFromAllPkgs(pkgs []models.PackageVulns) ([]*osvschema.Vulnerability, map[string]*osvschema.Vulnerability) {
	flatVulns := map[string]*osvschema.Vulnerability{}
	for _, pv := range pkgs {
		for _, vuln := range pv.Vulnerabilities {
			flatVulns[vuln.GetId()] = vuln
		}
	}

	vulns := make([]*osvschema.Vulnerability, 0, len(flatVulns))
	for _, v := range flatVulns {
		vulns = append(vulns, v)
	}

	return vulns, flatVulns
}

// Run runs the language specific analyzers on the code given packages and source info
func Run(source models.SourceInfo, pkgs []models.PackageVulns, callAnalysis map[string]bool) {
	// GoVulnCheck
	if source.Type == "lockfile" && filepath.Base(source.Path) == "go.mod" && callAnalysis["go"] {
		goAnalysis(pkgs, source)
	}

	if source.Type == "lockfile" && filepath.Base(source.Path) == "Cargo.lock" && callAnalysis["rust"] {
		rustAnalysis(pkgs, source)
	}
}
