package utils

import "testing"

func TestMultiPicklistJSONContainsSQL(t *testing.T) {
	tests := []struct {
		name      string
		fieldSQL  string
		valueSQL  string
		wantMatch string
		wantMiss  string
	}{
		{
			name:      "qualified analytics column",
			fieldSQL:  "t.`Tags__c`",
			valueSQL:  "'Hot'",
			wantMatch: "COALESCE(JSON_CONTAINS((CASE WHEN JSON_TYPE(t.`Tags__c`) = 'STRING' THEN CASE WHEN TRIM(JSON_UNQUOTE(t.`Tags__c`)) = '' THEN JSON_ARRAY() ELSE CAST(CONCAT('[', REPLACE(JSON_QUOTE(JSON_UNQUOTE(t.`Tags__c`)), ';', '\",\"'), ']') AS JSON) END ELSE t.`Tags__c` END), JSON_QUOTE('Hot')), 0) = 1",
			wantMiss:  "COALESCE(JSON_CONTAINS((CASE WHEN JSON_TYPE(t.`Tags__c`) = 'STRING' THEN CASE WHEN TRIM(JSON_UNQUOTE(t.`Tags__c`)) = '' THEN JSON_ARRAY() ELSE CAST(CONCAT('[', REPLACE(JSON_QUOTE(JSON_UNQUOTE(t.`Tags__c`)), ';', '\",\"'), ']') AS JSON) END ELSE t.`Tags__c` END), JSON_QUOTE('Hot')), 0) = 0",
		},
		{
			name:      "structured flow field with comma token",
			fieldSQL:  "Tags__c",
			valueSQL:  "'North, East'",
			wantMatch: "COALESCE(JSON_CONTAINS((CASE WHEN JSON_TYPE(Tags__c) = 'STRING' THEN CASE WHEN TRIM(JSON_UNQUOTE(Tags__c)) = '' THEN JSON_ARRAY() ELSE CAST(CONCAT('[', REPLACE(JSON_QUOTE(JSON_UNQUOTE(Tags__c)), ';', '\",\"'), ']') AS JSON) END ELSE Tags__c END), JSON_QUOTE('North, East')), 0) = 1",
			wantMiss:  "COALESCE(JSON_CONTAINS((CASE WHEN JSON_TYPE(Tags__c) = 'STRING' THEN CASE WHEN TRIM(JSON_UNQUOTE(Tags__c)) = '' THEN JSON_ARRAY() ELSE CAST(CONCAT('[', REPLACE(JSON_QUOTE(JSON_UNQUOTE(Tags__c)), ';', '\",\"'), ']') AS JSON) END ELSE Tags__c END), JSON_QUOTE('North, East')), 0) = 0",
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			if got := MultiPicklistJSONContainsSQL(tt.fieldSQL, tt.valueSQL, true); got != tt.wantMatch {
				t.Fatalf("match predicate = %q, want %q", got, tt.wantMatch)
			}
			if got := MultiPicklistJSONContainsSQL(tt.fieldSQL, tt.valueSQL, false); got != tt.wantMiss {
				t.Fatalf("miss predicate = %q, want %q", got, tt.wantMiss)
			}
		})
	}
}

func TestMultiPicklistJSONContainsTokenSetSQL(t *testing.T) {
	fieldSQL := "Tags__c"
	hotPresent := MultiPicklistJSONContainsSQL(fieldSQL, "'Hot'", true)
	coldPresent := MultiPicklistJSONContainsSQL(fieldSQL, "'Cold'", true)

	if got, want := MultiPicklistJSONContainsAllSQL(fieldSQL, []string{"'Hot'", "'Cold'"}), "("+hotPresent+" AND "+coldPresent+")"; got != want {
		t.Fatalf("MultiPicklistJSONContainsAllSQL = %q, want %q", got, want)
	}
	if got := MultiPicklistJSONContainsAllSQL(fieldSQL, nil); got != "0 = 1" {
		t.Fatalf("MultiPicklistJSONContainsAllSQL(nil) = %q, want 0 = 1", got)
	}
}
