package schema

import (
	"sync"
	"testing"

	"github.com/stretchr/testify/require"
	gormschema "gorm.io/gorm/schema"
)

func TestResourcePoolCompositeIndexes(t *testing.T) {
	t.Parallel()

	parsed, err := gormschema.Parse(&ResourcePool{}, &sync.Map{}, gormschema.NamingStrategy{})
	require.NoError(t, err)

	indexes := make(map[string][]string)
	for _, index := range parsed.ParseIndexes() {
		fields := make([]string, 0, len(index.Fields))
		for _, field := range index.Fields {
			fields = append(fields, field.DBName)
		}
		indexes[index.Name] = fields
	}

	require.Equal(t, []string{
		"owner_type",
		"owner_id",
		"deleted_at",
		"normalized_name",
	}, indexes["idx_rp_owner_live_name"])
	require.Equal(t, []string{
		"owner_type",
		"owner_id",
		"deleted_at",
		"cidr_start_ipv4",
	}, indexes["idx_rp_owner_live_cidr_start"])
	require.Equal(t, []string{
		"owner_type",
		"owner_id",
		"service_plan",
		"deleted_at",
		"created_at",
		"id",
	}, indexes["idx_rp_list_cursor"])
}

func TestResourcePoolNamespaceTableName(t *testing.T) {
	t.Parallel()

	parsed, err := gormschema.Parse(&ResourcePoolNamespace{}, &sync.Map{}, gormschema.NamingStrategy{})
	require.NoError(t, err)
	require.Equal(t, "resource_pool_namespaces", parsed.Table)
	require.True(t, parsed.FieldsByName["OrganizationId"].PrimaryKey)
}

func TestResourcePoolMetadataColumnTypes(t *testing.T) {
	t.Parallel()

	parsed, err := gormschema.Parse(&ResourcePool{}, &sync.Map{}, gormschema.NamingStrategy{})
	require.NoError(t, err)

	require.Equal(t, "BINARY(4)", parsed.FieldsByName["CidrStartIPv4"].TagSettings["TYPE"])
	require.Equal(t, "BINARY(4)", parsed.FieldsByName["CidrEndIPv4"].TagSettings["TYPE"])
	require.Equal(t, "cloud_resource_tags_json", parsed.FieldsByName["CloudResourceTags"].DBName)
	require.Equal(t, "JSON", parsed.FieldsByName["CloudResourceTags"].TagSettings["TYPE"])
}
