package utils

import (
	"net/url"
	"strings"
)

const (
	redactedQueryValue     = "redacted"
	redactedURIPlaceholder = "<redacted-uri>"
)

func RedactSourceURI(sourceURI string) string {
	if sourceURI == "" {
		return ""
	}

	u, err := url.Parse(sourceURI)
	if err != nil {
		lower := strings.ToLower(sourceURI)
		if strings.Contains(lower, "sas-token=") || strings.Contains(lower, "secret-access-key=") {
			return redactedURIPlaceholder
		}
		return sourceURI
	}

	q, qerr := url.ParseQuery(u.RawQuery)
	if qerr != nil {
		lower := strings.ToLower(u.RawQuery)
		if strings.Contains(lower, "sas-token=") || strings.Contains(lower, "secret-access-key=") {
			return redactedURIPlaceholder
		}
		return sourceURI
	}

	changed := false
	for k := range q {
		if strings.EqualFold(k, "sas-token") || strings.EqualFold(k, "secret-access-key") {
			q.Set(k, redactedQueryValue)
			changed = true
		}
	}
	if changed {
		u.RawQuery = q.Encode()
	}
	if u.Fragment != "" {
		u.Fragment = ""
	}
	return u.String()
}

func SanitizeImportIntoSQL(sql string) string {
	if sql == "" {
		return ""
	}

	upper := strings.ToUpper(sql)
	marker := "FROM '"
	idx := strings.Index(upper, marker)
	if idx < 0 {
		return sql
	}
	start := idx + len(marker)
	endRel := strings.Index(sql[start:], "'")
	if endRel < 0 {
		return sql[:start] + redactedURIPlaceholder
	}
	end := start + endRel

	uri := sql[start:end]
	redacted := RedactSourceURI(uri)
	if redacted == "" {
		redacted = redactedURIPlaceholder
	}
	if redacted == uri {
		return sql
	}
	return sql[:start] + redacted + sql[end:]
}
