package event_svc

import (
	"context"
	"testing"
	"time"

	"github.com/stretchr/testify/require"
	core_event "github.com/tidbcloud/core-svc/event"
	"github.com/tidbcloud/pkgv2/bizerr"
	"github.com/tidbcloud/pkgv2/db/mock_db"
	"github.com/tidbcloud/serverless-service/internal/domain/entity"
	"github.com/tidbcloud/serverless-service/internal/domain/repo/mock_repo"
	"go.uber.org/mock/gomock"
)

func TestVirtualizedBackupDeletionUsesEventTime(t *testing.T) {
	ctrl := gomock.NewController(t)
	dbProvider := mock_db.NewMockTransProvider(ctrl)
	schedules := mock_repo.NewMockBackupScheduleRepo(ctrl)
	histories := mock_repo.NewMockBackupScheduleHistoryRepo(ctrl)
	eventDeletedAt := time.Date(2026, time.July, 13, 8, 0, 0, 123000000, time.UTC)
	schedule := &entity.BackupSchedule{
		ID:         1,
		ClusterID:  "1",
		Kubernetes: "k8s-1",
	}

	dbProvider.EXPECT().Transaction(gomock.Any(), gomock.Any()).DoAndReturn(
		func(ctx context.Context, callback func(context.Context) error) error { return callback(ctx) },
	)
	schedules.EXPECT().List(gomock.Any(), entity.ListBackupScheduleOptions{
		ClusterId:      "1",
		IncludeDeleted: true,
	}).Return([]*entity.BackupSchedule{schedule}, nil)
	histories.EXPECT().ArchiveCurrentSchedule(gomock.Any(), schedule, eventDeletedAt, gomock.Any()).DoAndReturn(
		func(_ context.Context, _ *entity.BackupSchedule, _ time.Time, deletedAt *time.Time) bizerr.BizError {
			require.Equal(t, eventDeletedAt, *deletedAt)
			return nil
		},
	)
	histories.EXPECT().MarkDeleted(gomock.Any(), "1", eventDeletedAt).Return(nil)

	svc := NewVirtualizedBackupEventService(schedules, histories, dbProvider)
	require.NoError(t, svc.HandleClusterEvent(context.Background(), &core_event.ClusterEvent{
		ClusterID:        1,
		EventType:        core_event.ClusterEventTypeDeleted,
		EventCreatedAtMs: eventDeletedAt.UnixMilli(),
	}))
}
