package entity

import (
	"testing"

	"github.com/stretchr/testify/require"
)

func TestFilterRule_ToContent(t *testing.T) {
	tests := []struct {
		name       string
		filterRule *AuditLogFilterRule
		expected   string
		expectErr  bool
	}{
		{
			name: "Valid filter with class and table",
			filterRule: &AuditLogFilterRule{
				Name:  "test_rule",
				Users: []string{"test_user"},
				Filters: []*AuditLogFilter{
					{
						Classes: []string{"QUERY_DML", "QUERY_DDL"},
						Tables:  []string{"mysql.*"},
					},
				},
			},
			expected:  `{"filter":[{"class":["QUERY_DML","QUERY_DDL"],"table":["mysql.*"]}]}`,
			expectErr: false,
		},
		{
			name: "Empty filter",
			filterRule: &AuditLogFilterRule{
				Name:    "empty_rule",
				Users:   []string{"test_user"},
				Filters: []*AuditLogFilter{},
			},
			expected:  `{}`,
			expectErr: false,
		},
		{
			name: "nil filter",
			filterRule: &AuditLogFilterRule{
				Name:    "empty_rule",
				Users:   []string{"test_user"},
				Filters: nil,
			},
			expected:  `{}`,
			expectErr: false,
		},
		{
			name: "Filter with status codes",
			filterRule: &AuditLogFilterRule{
				Name:  "status_code_rule",
				Users: []string{"test_user"},
				Filters: []*AuditLogFilter{
					{
						StatusCodes: []int32{200, 404},
					},
				},
			},
			expected:  `{"filter":[{"status_code":[200,404]}]}`,
			expectErr: false,
		},
		{
			name: "Filter with mutil rules",
			filterRule: &AuditLogFilterRule{
				Name:  "mutil_rules",
				Users: []string{"test_user"},
				Filters: []*AuditLogFilter{
					{
						Classes: []string{"QUERY_DML"},
						Tables:  []string{"mysql.*"},
					},
					{
						ClassesExclude: []string{"QUERY_DDL"},
						TablesExclude:  []string{"test.*"},
					},
				},
			},
			expected:  `{"filter":[{"class":["QUERY_DML"],"table":["mysql.*"]},{"class_excl":["QUERY_DDL"],"table_excl":["test.*"]}]}`,
			expectErr: false,
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			content, err := tt.filterRule.ToContent()
			if tt.expectErr {
				require.Error(t, err)
			} else {
				require.NoError(t, err)
				require.Equal(t, tt.expected, content)
			}
		})
	}
}
