package common

import (
	"testing"

	"github.com/bitechdev/ResolveSpec/pkg/reflection"
)

func TestExtractSourceColumn(t *testing.T) {
	testCases := []struct {
		name     string
		input    string
		expected string
	}{
		{
			name:     "simple column name",
			input:    "columna",
			expected: "columna",
		},
		{
			name:     "column with ->> operator",
			input:    "columna->>'val'",
			expected: "columna",
		},
		{
			name:     "column with -> operator",
			input:    "columna->'key'",
			expected: "columna",
		},
		{
			name:     "column with table prefix and ->> operator",
			input:    "table.columna->>'val'",
			expected: "table.columna",
		},
		{
			name:     "column with table prefix and -> operator",
			input:    "table.columna->'key'",
			expected: "table.columna",
		},
		{
			name:     "complex JSON path with ->>",
			input:    "data->>'nested'->>'value'",
			expected: "data",
		},
		{
			name:     "column with spaces before operator",
			input:    "columna ->>'val'",
			expected: "columna",
		},
	}

	for _, tc := range testCases {
		t.Run(tc.name, func(t *testing.T) {
			result := reflection.ExtractSourceColumn(tc.input)
			if result != tc.expected {
				t.Errorf("reflection.ExtractSourceColumn(%q) = %q; want %q", tc.input, result, tc.expected)
			}
		})
	}
}

func TestValidateColumnWithJSONOperators(t *testing.T) {
	// Create a test model
	type TestModel struct {
		ID       int    `json:"id"`
		Name     string `json:"name"`
		Data     string `json:"data"` // JSON column
		Metadata string `json:"metadata"`
	}

	validator := NewColumnValidator(TestModel{})

	testCases := []struct {
		name      string
		column    string
		shouldErr bool
	}{
		{
			name:      "simple valid column",
			column:    "name",
			shouldErr: false,
		},
		{
			name:      "valid column with ->> operator",
			column:    "data->>'field'",
			shouldErr: false,
		},
		{
			name:      "valid column with -> operator",
			column:    "metadata->'key'",
			shouldErr: false,
		},
		{
			name:      "invalid column",
			column:    "invalid_column",
			shouldErr: true,
		},
		{
			name:      "invalid column with ->> operator",
			column:    "invalid_column->>'field'",
			shouldErr: true,
		},
		{
			name:      "cql prefixed column (always valid)",
			column:    "cql_computed",
			shouldErr: false,
		},
		{
			name:      "empty column",
			column:    "",
			shouldErr: false,
		},
	}

	for _, tc := range testCases {
		t.Run(tc.name, func(t *testing.T) {
			err := validator.ValidateColumn(tc.column)
			if tc.shouldErr && err == nil {
				t.Errorf("ValidateColumn(%q) expected error, got nil", tc.column)
			}
			if !tc.shouldErr && err != nil {
				t.Errorf("ValidateColumn(%q) expected no error, got %v", tc.column, err)
			}
		})
	}
}
