package br

import (
	"testing"
	"time"

	"github.com/stretchr/testify/require"

	globalcommonv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/common/v1"
	globalngv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/nextgen/v1"
	"github.com/tidbcloud/tidb-management-service/nextgen-global-service/domain/entity"
	"github.com/tidbcloud/tidb-management-service/nextgen-global-service/infra/repoimpl/schema"
)

func TestRestoreStatusWithDetails(t *testing.T) {
	requestedAt := time.Date(2026, 8, 10, 9, 31, 13, 0, time.UTC)
	updatedAt := requestedAt.Add(2*time.Minute + 10*time.Second)
	pointInTime := requestedAt.Add(-time.Hour)
	restore := &entity.Restore{Restore: &schema.Restore{
		CreatedAt:             requestedAt,
		UpdatedAt:             updatedAt,
		RestoreMode:           schema.RestoreModePitr,
		PointInTime:           &pointInTime,
		SourceClusterId:       10228420950222724340,
		BackupId:              72169,
		ExpectRestoreDataSize: 103414155,
		SourceRegionId:        "us-west-2",
		SourceCloudProvider:   "aws",
		SourceServicePlan:     "Essential_V2",
	}}

	status := restoreStatusWithDetails(&globalngv1.RestoreStatusResponse{}, restore)

	require.Equal(t, uint64(10228420950222724340), status.GetDetails().GetSourceClusterId())
	require.Equal(t, globalngv1.RestoreMode_RESTORE_MODE_PITR, status.GetDetails().GetRestoreMode())
	require.Equal(t, uint64(72169), status.GetDetails().GetBackupId())
	require.Equal(t, pointInTime, status.GetDetails().GetPointInTime().AsTime())
	require.Equal(t, requestedAt, status.GetDetails().GetRestoreRequestedTime().AsTime())
	require.Equal(t, updatedAt, status.GetDetails().GetRestoreUpdatedTime().AsTime())
	require.Equal(t, uint64(103414155), status.GetDetails().GetExpectedRestoreDataSizeBytes())
	require.Equal(t, "us-west-2", status.GetDetails().GetSourceRegionId())
	require.Equal(t, globalcommonv1.CloudProvider_AWS, status.GetDetails().GetSourceCloudProvider())
	require.Equal(t, globalcommonv1.ServicePlan_Essential_V2, status.GetDetails().GetSourceServicePlan())
}
