package central

import (
	"testing"

	"github.com/tidwall/gjson"
)

func TestToLoggingString(t *testing.T) {
	tests := []struct {
		name         string
		input        connectionModel
		expectedJSON string
	}{
		{
			name: "Redacts sensitive fields",
			input: connectionModel{
				User:     "admin",
				Password: "secret",
				S3Param: s3Parameter{
					AccessKeyId:     "AKIA123456789",
					SecretAccessKey: "s3SecretKey",
				},
			},
			expectedJSON: `{"user":"****","password":"****","s3_param":{"access_key_id":"****","secret_access_key":"****"}}`,
		},
		{
			name: "Handles empty fields",
			input: connectionModel{
				User:     "",
				Password: "",
				S3Param:  s3Parameter{},
			},
			expectedJSON: `{"user":"","password":"","s3_param":{"access_key_id":"","secret_access_key":""}}`,
		},
		{
			name: "Handles partial fields",
			input: connectionModel{
				User:     "admin",
				Password: "",
				S3Param: s3Parameter{
					AccessKeyId: "AKIA123456789",
				},
			},
			expectedJSON: `{"user":"****","password":"","s3_param":{"access_key_id":"****","secret_access_key":""}}`,
		},
		{
			name: "Handles pulsar fields",
			input: connectionModel{
				User:     "admin",
				Password: "",
				PulsarParam: pulsarParameter{
					Password: "password",
					Token:    "token",
				},
			},
			expectedJSON: `{"user":"****","password":"","pulsar_param":{"password":"****","token":""}}`,
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			result := tt.input.ToLoggingString()
			if !jsonEqual(result, tt.expectedJSON) {
				t.Errorf("Expected %s, but got %s", tt.expectedJSON, result)
			}
		})
	}
}

func jsonEqual(a, b string) bool {
	fields := []string{"user", "password", "s3_param.access_key_id", "s3_param.secret_access_key"}
	for _, v := range fields {
		if gjson.Get(a, v).String() != gjson.Get(b, v).String() {
			return false
		}
	}
	return true
}
