package models

import (
	"reflect"
	"testing"
)

func TestTargetRecordReadAssociationsNormalizesRuntimeSafeShapes(t *testing.T) {
	tests := []struct {
		name   string
		policy *RowReadPolicy
		want   []RowReadTargetAssociation
		valid  bool
	}{
		{
			name: "legacy",
			policy: &RowReadPolicy{
				TargetObjectField: " TargetType ",
				TargetRecordField: " TargetId ",
			},
			want: []RowReadTargetAssociation{{
				TargetObjectField: "TargetType",
				TargetRecordField: "TargetId",
			}},
			valid: true,
		},
		{
			name: "grouped",
			policy: &RowReadPolicy{TargetAssociations: []RowReadTargetAssociation{
				{TargetObjectField: " WhoType ", TargetRecordField: " WhoId "},
				{TargetObjectField: "WhatType", TargetRecordField: "WhatId"},
			}},
			want: []RowReadTargetAssociation{
				{TargetObjectField: "WhoType", TargetRecordField: "WhoId"},
				{TargetObjectField: "WhatType", TargetRecordField: "WhatId"},
			},
			valid: true,
		},
		{
			name:   "empty",
			policy: &RowReadPolicy{},
		},
		{
			name: "partial legacy",
			policy: &RowReadPolicy{
				TargetRecordField: "TargetId",
			},
		},
		{
			name: "partial grouped association",
			policy: &RowReadPolicy{TargetAssociations: []RowReadTargetAssociation{
				{TargetObjectField: "WhoType", TargetRecordField: "WhoId"},
				{TargetRecordField: "WhatId"},
			}},
		},
		{
			name: "mixed legacy and grouped",
			policy: &RowReadPolicy{
				TargetObjectField: "LegacyType",
				TargetRecordField: "LegacyId",
				TargetAssociations: []RowReadTargetAssociation{{
					TargetObjectField: "WhoType",
					TargetRecordField: "WhoId",
				}},
			},
		},
	}

	for _, tc := range tests {
		t.Run(tc.name, func(t *testing.T) {
			got, valid := tc.policy.TargetRecordReadAssociations()
			if valid != tc.valid {
				t.Fatalf("valid = %v, want %v", valid, tc.valid)
			}
			if !reflect.DeepEqual(got, tc.want) {
				t.Fatalf("associations = %#v, want %#v", got, tc.want)
			}
		})
	}
}
