// Copyright 2024 The Go 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 idstr provides utilities for working with vulnerability
// identifier strings.
package idstr

import "regexp"

const ghsaStr = `GHSA-[^-]{4}-[^-]{4}-[^-]{4}`

var (
	ghsaRE, ghsaStrict = re(ghsaStr)
)

func IsGHSA(s string) bool {
	return ghsaStrict.MatchString(s)
}

func FindGHSA(s string) string {
	return ghsaRE.FindString(s)
}

const cveStr = `CVE-\d{4}-\d{4,}`

var (
	cveRE, cveStrict = re(cveStr)
)

func IsCVE(s string) bool {
	return cveStrict.MatchString(s)
}

func FindCVE(s string) string {
	return cveRE.FindString(s)
}

const goIDStr = `GO-\d{4}-\d{4,}`

var (
	goRE, goIDStrict = re(goIDStr)
)

func IsGoID(s string) bool {
	return goIDStrict.MatchString(s)
}

func findGoID(s string) string {
	return goRE.FindString(s)
}

func re(s string) (*regexp.Regexp, *regexp.Regexp) {
	return regexp.MustCompile(s), regexp.MustCompile(`^` + s + `$`)
}

// IsIdentifier returns whether the given ID is a recognized identifier
// (currently, either a GHSA, CVE, or Go ID).
func IsIdentifier(id string) bool {
	return IsAliasType(id) || IsGoID(id)
}

func FindID(s string) string {
	if cve := FindCVE(s); cve != "" {
		return cve
	}
	if ghsa := FindGHSA(s); ghsa != "" {
		return ghsa
	}
	if gid := findGoID(s); gid != "" {
		return gid
	}
	return ""
}

// IsAliasType returns whether the given ID is a recognized alias type
// (currently, either a GHSA or CVE).
func IsAliasType(id string) bool {
	return IsGHSA(id) || IsCVE(id)
}
