package manager

import (
	"regexp"
	"strings"

	"github.com/stashapp/stash/pkg/logger"
)

func excludeFiles(files []string, patterns []string) ([]string, int) {
	if patterns == nil {
		logger.Infof("No exclude patterns in config")
		return files, 0
	} else {
		var results []string
		var exclCount int

		fileRegexps := generateRegexps(patterns)

		if len(fileRegexps) == 0 {
			logger.Infof("Excluded 0 files from scan")
			return files, 0
		}

		for _, f := range files {
			if matchFileSimple(f, fileRegexps) {
				logger.Infof("File matched pattern. Excluding:\"%s\"", f)
				exclCount++
			} else {
				// if pattern doesn't match add file to list
				results = append(results, f)
			}
		}
		logger.Infof("Excluded %d file(s) from scan", exclCount)
		return results, exclCount
	}
}

func matchFileRegex(file string, fileRegexps []*regexp.Regexp) bool {
	for _, regPattern := range fileRegexps {
		if regPattern.MatchString(file) {
			return true
		}
	}
	return false
}

func matchFile(file string, patterns []string) bool {
	if patterns != nil {
		fileRegexps := generateRegexps(patterns)

		return matchFileRegex(file, fileRegexps)
	}

	return false
}

func generateRegexps(patterns []string) []*regexp.Regexp {

	var fileRegexps []*regexp.Regexp

	for _, pattern := range patterns {
		if !strings.HasPrefix(pattern, "(?i)") {
			pattern = "(?i)" + pattern
		}
		reg, err := regexp.Compile(pattern)
		if err != nil {
			logger.Errorf("Exclude :%v", err)
		} else {
			fileRegexps = append(fileRegexps, reg)
		}
	}

	if len(fileRegexps) == 0 {
		return nil
	} else {
		return fileRegexps
	}

}

func matchFileSimple(file string, regExps []*regexp.Regexp) bool {
	for _, regPattern := range regExps {
		if regPattern.MatchString(file) {
			return true
		}
	}
	return false
}
