package logging

import (
	"errors"
	"fmt"
	"net/url"
	"strings"
	"testing"
)

// SanitizeErr обязана убрать URL (носитель секрета) из *url.Error, оставив
// первопричину — это единый предохранитель от утечки токена/ключа в логи.
func TestSanitizeErr(t *testing.T) {
	cause := errors.New("dial tcp 1.2.3.4:443: connect: connection refused")

	t.Run("url error with token in path", func(t *testing.T) {
		ue := &url.Error{
			Op:  "Get",
			URL: "https://api.telegram.org/botSECRET123:AAtoken/getUpdates",
			Err: cause,
		}
		got := SanitizeErr(ue)
		if strings.Contains(got.Error(), "SECRET123") || strings.Contains(got.Error(), "AAtoken") {
			t.Fatalf("токен утёк: %v", got)
		}
		if !errors.Is(got, cause) {
			t.Fatalf("первопричина потеряна: %v", got)
		}
	})

	t.Run("url error with api_key in query", func(t *testing.T) {
		ue := &url.Error{
			Op:  "Get",
			URL: "https://api.themoviedb.org/3/search/movie?api_key=DEADBEEFSECRET&query=dune",
			Err: cause,
		}
		if strings.Contains(SanitizeErr(ue).Error(), "DEADBEEFSECRET") {
			t.Fatalf("api_key утёк: %v", SanitizeErr(ue))
		}
	})

	t.Run("wrapped url error is unwrapped via errors.As", func(t *testing.T) {
		wrapped := fmt.Errorf("metadata: request: %w", &url.Error{
			Op: "Get", URL: "https://x/api_key=SECRET", Err: cause,
		})
		if strings.Contains(SanitizeErr(wrapped).Error(), "SECRET") {
			t.Fatalf("секрет утёк из обёрнутой ошибки: %v", SanitizeErr(wrapped))
		}
	})

	t.Run("non-url error passes through unchanged", func(t *testing.T) {
		plain := errors.New("plain domain error")
		if !errors.Is(SanitizeErr(plain), plain) {
			t.Fatalf("обычная ошибка изменена: %v", SanitizeErr(plain))
		}
	})

	t.Run("nil stays nil", func(t *testing.T) {
		if SanitizeErr(nil) != nil {
			t.Fatal("nil должен оставаться nil")
		}
	})
}
