package data

import "github.com/go-enry/go-enry/v2/data/rule"

// Heuristics implements a rule-based content matching engine.

// Heuristics is a number of sequentially applied rule.Heuristic where a
// matching one disambiguates language(s) for a single file extension.
type Heuristics []rule.Heuristic

// Match returns languages identified by the matching rule of the heuristic.
func (hs Heuristics) Match(data []byte) []string {
	var matchedLangs []string
	for _, heuristic := range hs {
		if heuristic.Match(data) {
			for _, langOrAlias := range heuristic.Languages() {
				lang, ok := LanguageByAlias(langOrAlias)
				if !ok { // should never happen
					// reaching here means language name/alias in heuristics.yml
					// is not consistent with languages.yml
					// but we do not surface any such error at the API
					continue
				}
				matchedLangs = append(matchedLangs, lang)
			}
			break
		}
	}
	return matchedLangs
}

// matchString is a convenience used only in tests.
func (hs *Heuristics) matchString(data string) []string {
	return hs.Match([]byte(data))
}
