package repository

import (
	"testing"

	"github.com/stretchr/testify/assert"

	globalcommonv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/common/v1"
	tidbmgmtservicev1 "github.com/tidbcloud/tidb-management-service/api/spec/tidb_mgmt_service/v1"
	"github.com/tidbcloud/tidb-management-service/tidb-mgmt-service/domain/entity"
	"github.com/tidbcloud/tidb-management-service/tidb-mgmt-service/infra/repository/schema"
)

func TestCvtMigrationCluster_RestoreMode_Regions(t *testing.T) {
	t.Run("Entity to Model - Valid Enum Values", func(t *testing.T) {
		en := &entity.MigrationCluster{
			RestoreMode:    tidbmgmtservicev1.MigrationCluster_SNAPSHOT,
			TargetRegionId: globalcommonv1.Region_AWS_US_EAST_1,
			BackupRegionId: globalcommonv1.Region_AWS_US_WEST_2,
		}

		model := cvtMigrationClusterEnToModel(en)

		// Verify that .String() produces the expected string representation
		assert.Equal(t, "SNAPSHOT", model.RestoreMode)
		assert.Equal(t, "us-east-1", model.TargetRegionID)
		assert.Equal(t, "us-west-2", model.BackupRegionID)
	})

	t.Run("Entity to Model - Unspecified Enum Values", func(t *testing.T) {
		en := &entity.MigrationCluster{
			RestoreMode:    tidbmgmtservicev1.MigrationCluster_MODE_UNSPECIFIED,
			TargetRegionId: globalcommonv1.Region_NAME_UNSPECIFIED,
			BackupRegionId: globalcommonv1.Region_NAME_UNSPECIFIED,
		}

		model := cvtMigrationClusterEnToModel(en)

		// Verify that unspecified values are ignored (empty string)
		assert.Empty(t, model.RestoreMode)
		assert.Empty(t, model.TargetRegionID)
		assert.Empty(t, model.BackupRegionID)
	})

	t.Run("Model to Entity - Valid String Values", func(t *testing.T) {
		model := &schema.MigrationCluster{
			RestoreMode:    "PITR",
			TargetRegionID: "us-west-2",
			BackupRegionID: "us-east-1",
		}

		en := cvtMigrationClusterModelToEn(model)

		// Verify that the string is correctly parsed back to the enum
		assert.Equal(t, tidbmgmtservicev1.MigrationCluster_PITR, en.RestoreMode)
		assert.Equal(t, globalcommonv1.Region_AWS_US_WEST_2, en.TargetRegionId)
		assert.Equal(t, globalcommonv1.Region_AWS_US_EAST_1, en.BackupRegionId)
	})

	t.Run("Model to Entity - Empty String Values", func(t *testing.T) {
		model := &schema.MigrationCluster{
			RestoreMode:    "",
			TargetRegionID: "",
			BackupRegionID: "",
		}

		en := cvtMigrationClusterModelToEn(model)

		// Verify that empty strings result in the default (unspecified) enum value
		assert.Equal(t, tidbmgmtservicev1.MigrationCluster_MODE_UNSPECIFIED, en.RestoreMode)
		assert.Equal(t, globalcommonv1.Region_NAME_UNSPECIFIED, en.TargetRegionId)
		assert.Equal(t, globalcommonv1.Region_NAME_UNSPECIFIED, en.BackupRegionId)
	})
}
