package scanning

// pattern holds a compiled regex-like pattern string and its metadata.
// We use raw string patterns rather than importing regexp for each check;
// the Scanner compiles all patterns once at startup.
type pattern struct {
	Name        string
	Description string
	Raw         string // the regex pattern (compiled at init)
	Severity    string // "high", "medium", "low"
}

// Patterns is the list of secret patterns checked against every pushed commit.
// Patterns are ordered by severity — high first.
var Patterns = []pattern{
	{
		Name:        "aws-access-key-id",
		Description: "AWS Access Key ID",
		Raw:         `AKIA[0-9A-Z]{16}`,
		Severity:    "high",
	},
	{
		Name:        "aws-secret-key",
		Description: "AWS Secret Access Key",
		Raw:         `(?i)aws[_-]?(secret|private)[_-]?(access[_-]?)?key['"]?\s*[:=]\s*['"]?[A-Za-z0-9\/+=]{40}`,
		Severity:    "high",
	},
	{
		Name:        "github-token",
		Description: "GitHub Personal Access Token",
		Raw:         `gh[pousr]_[A-Za-z0-9_]{36,}`,
		Severity:    "high",
	},
	{
		Name:        "gitlab-token",
		Description: "GitLab Personal Access Token",
		Raw:         `glpat-[A-Za-z0-9\-_]{20,}`,
		Severity:    "high",
	},
	{
		Name:        "generic-api-key",
		Description: "Generic API key assignment (high entropy)",
		Raw:         `(?i)(api[_-]?key|apikey|api[_-]?secret|api[_-]?token)['"]?\s*[:=]\s*['"][A-Za-z0-9_\-\.]{20,64}`,
		Severity:    "high",
	},
	{
		Name:        "bearer-token",
		Description: "Bearer token in HTTP header",
		Raw:         `(?i)authorization:\s*bearer\s+[A-Za-z0-9_\-\.]{20,}`,
		Severity:    "high",
	},
	{
		Name:        "slack-token",
		Description: "Slack Bot / Webhook token",
		Raw:         `xox[baprs]-[A-Za-z0-9\-]{10,}`,
		Severity:    "high",
	},
	{
		Name:        "google-api-key",
		Description: "Google API Key",
		Raw:         `AIza[0-9A-Za-z\-_]{35}`,
		Severity:    "high",
	},
	{
		Name:        "google-service-account",
		Description: "Google Service Account",
		Raw:         `[0-9]+-[0-9a-z]{32}\.apps\.googleusercontent\.com`,
		Severity:    "high",
	},
	{
		Name:        "ssh-private-key",
		Description: "SSH / TLS private key embed",
		Raw:         `-----BEGIN\s+(RSA|EC|OPENSSH|DSA|PRIVATE)(\s+PRIVATE)?\s+KEY-----`,
		Severity:    "high",
	},
	{
		Name:        "jwt-token",
		Description: "JSON Web Token (JWT)",
		Raw:         `eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}`,
		Severity:    "medium",
	},
	{
		Name:        "generic-password",
		Description: "Generic password/secret field assignment",
		Raw:         `(?i)(password|passwd|pwd|secret)['"]?\s*[:=]\s*['"][A-Za-z0-9!@#$%^&*()_+\-=\[\]{}|;:,.<>?]{8,}`,
		Severity:    "medium",
	},
	{
		Name:        "npm-token",
		Description: "npm access token",
		Raw:         `npm_[A-Za-z0-9]{36,}`,
		Severity:    "high",
	},
	{
		Name:        "pg-connection-string",
		Description: "PostgreSQL connection string",
		Raw:         `postgres(ql)?://[A-Za-z0-9_]+:[^@\s]+@`,
		Severity:    "high",
	},
	{
		Name:        "redis-connection-string",
		Description: "Redis connection string with password",
		Raw:         `redis://[^:@\s]+:[^@\s]+@`,
		Severity:    "high",
	},
}
