package store

import "testing"

func TestAuthUserFromOIDCProjectionIncludesProfile(t *testing.T) {
	projected := authUserFromOIDCProjection(GatewayUser{
		ID: "gateway-user", ExternalUserID: "external-user", Username: "alice",
		DisplayName: "王小明", Email: "alice@example.test", Phone: "+8613800000000",
		AvatarURL: "https://static.example.test/avatar.png",
	}, "default")
	if projected.DisplayName != "王小明" || projected.Email != "alice@example.test" ||
		projected.Phone != "+8613800000000" || projected.AvatarURL != "https://static.example.test/avatar.png" {
		t.Fatalf("OIDC profile was not projected: %#v", projected)
	}
}

func TestNormalizeOIDCUserInputBoundsProfileClaims(t *testing.T) {
	input := normalizeOIDCUserInput(ResolveOrProvisionOIDCUserInput{
		DisplayName: "  王小明  ",
		Email:       "  alice@example.test  ",
		Phone:       "  +8613800000000  ",
		AvatarURL:   "  https://static.example.test/avatar.png  ",
	})
	if input.DisplayName != "王小明" || input.Email != "alice@example.test" ||
		input.Phone != "+8613800000000" || input.AvatarURL != "https://static.example.test/avatar.png" {
		t.Fatalf("OIDC profile was not normalized: %#v", input)
	}
}

func TestOIDCProjectionKindRequiresExplicitCompatibleContext(t *testing.T) {
	applicationID := "11111111-1111-4111-8111-111111111111"
	tests := []struct {
		name  string
		input ResolveOrProvisionOIDCUserInput
		want  string
	}{
		{
			name: "platform in multi-tenant application",
			input: ResolveOrProvisionOIDCUserInput{
				ContextType: "platform", TenantMode: "multi_tenant",
				ApplicationID: applicationID,
			},
			want: "platform",
		},
		{
			name: "tenant in multi-tenant application",
			input: ResolveOrProvisionOIDCUserInput{
				ContextType: "tenant", TenantMode: "multi_tenant",
				ApplicationID: applicationID,
				TenantID:      "22222222-2222-4222-8222-222222222222",
			},
			want: "multi_tenant",
		},
		{
			name: "tenant in single-tenant application",
			input: ResolveOrProvisionOIDCUserInput{
				ContextType: "tenant", TenantMode: "single_tenant",
				TenantID: "tenant-contract-id",
			},
			want: "single_tenant",
		},
		{
			name: "missing context",
			input: ResolveOrProvisionOIDCUserInput{
				TenantMode: "multi_tenant", ApplicationID: applicationID,
				TenantID: "22222222-2222-4222-8222-222222222222",
			},
		},
		{
			name: "platform context with tenant",
			input: ResolveOrProvisionOIDCUserInput{
				ContextType: "platform", TenantMode: "multi_tenant",
				ApplicationID: applicationID,
				TenantID:      "22222222-2222-4222-8222-222222222222",
			},
		},
	}
	for _, test := range tests {
		t.Run(test.name, func(t *testing.T) {
			if got := oidcProjectionKind(test.input); got != test.want {
				t.Fatalf("projection kind=%q, want %q", got, test.want)
			}
		})
	}
}
