package impl

import (
	"testing"

	"github.com/stretchr/testify/require"
	"github.com/tidbcloud/dataflow-service/app/repo/entity"
)

func TestCloneReplayForExecutionDeepCopiesMutableFields(t *testing.T) {
	externalID := "external-id"
	serviceAccountJSON := "service-account-json"
	username := "user"
	password := "password"
	replayStartTime := "2026-05-25T00:00:00Z"

	replayEnt := &entity.Replay{
		SourceAuditCredential: &entity.AuditLogAddr{
			AWS: &entity.AWSAuditLog{
				S3URL:      "s3://bucket/path",
				ExternalID: &externalID,
			},
			GCP: &entity.GCPAuditLog{
				GCSURL:             "gs://bucket/path",
				ServiceAccountJSON: &serviceAccountJSON,
			},
			Aliyun: &entity.AliyunAuditLog{
				BucketURL:       "oss://bucket/path",
				AccessKeyID:     "ak",
				SecretAccessKey: "sk",
			},
		},
		ReplayTasks: entity.ReplayTaskList{
			{
				DataSource: entity.ReplayDataSource{
					SourceAuditLogAddrs: []entity.AuditLogAddr{
						{
							AWS: &entity.AWSAuditLog{
								S3URL:      "s3://task-bucket/path",
								ExternalID: &externalID,
							},
						},
					},
				},
				DataTarget: entity.ReplayDataTarget{
					Username: &username,
					Password: &password,
				},
				Resources: &entity.ReplayTaskResources{
					InstanceType: "2C4G",
				},
				PerReplayConfigs: []entity.ReplayConfig{
					{
						ReplayStartTime: &replayStartTime,
						CustomArguments: map[string]string{"timezone": "UTC"},
					},
				},
			},
		},
	}

	cloned := cloneReplayForExecution(replayEnt)
	require.NotSame(t, replayEnt, cloned)
	require.NotSame(t, replayEnt.SourceAuditCredential, cloned.SourceAuditCredential)
	require.NotSame(t, replayEnt.SourceAuditCredential.AWS, cloned.SourceAuditCredential.AWS)
	require.NotSame(t, replayEnt.SourceAuditCredential.AWS.ExternalID, cloned.SourceAuditCredential.AWS.ExternalID)
	require.NotSame(t, replayEnt.SourceAuditCredential.GCP, cloned.SourceAuditCredential.GCP)
	require.NotSame(t, replayEnt.SourceAuditCredential.GCP.ServiceAccountJSON, cloned.SourceAuditCredential.GCP.ServiceAccountJSON)
	require.NotSame(t, replayEnt.SourceAuditCredential.Aliyun, cloned.SourceAuditCredential.Aliyun)
	require.NotSame(t, replayEnt.ReplayTasks[0].DataTarget.Username, cloned.ReplayTasks[0].DataTarget.Username)
	require.NotSame(t, replayEnt.ReplayTasks[0].DataTarget.Password, cloned.ReplayTasks[0].DataTarget.Password)
	require.NotSame(t, replayEnt.ReplayTasks[0].Resources, cloned.ReplayTasks[0].Resources)
	require.NotSame(t, replayEnt.ReplayTasks[0].PerReplayConfigs[0].ReplayStartTime, cloned.ReplayTasks[0].PerReplayConfigs[0].ReplayStartTime)

	*cloned.SourceAuditCredential.AWS.ExternalID = "changed-external-id"
	*cloned.SourceAuditCredential.GCP.ServiceAccountJSON = "changed-service-account-json"
	cloned.SourceAuditCredential.Aliyun.AccessKeyID = "changed-ak"
	*cloned.ReplayTasks[0].DataTarget.Username = "changed-user"
	*cloned.ReplayTasks[0].DataTarget.Password = "changed-password"
	cloned.ReplayTasks[0].Resources.InstanceType = "4C8G"
	*cloned.ReplayTasks[0].PerReplayConfigs[0].ReplayStartTime = "2026-05-26T00:00:00Z"
	cloned.ReplayTasks[0].PerReplayConfigs[0].CustomArguments["timezone"] = "Asia/Shanghai"

	require.Equal(t, "external-id", *replayEnt.SourceAuditCredential.AWS.ExternalID)
	require.Equal(t, "service-account-json", *replayEnt.SourceAuditCredential.GCP.ServiceAccountJSON)
	require.Equal(t, "ak", replayEnt.SourceAuditCredential.Aliyun.AccessKeyID)
	require.Equal(t, "user", *replayEnt.ReplayTasks[0].DataTarget.Username)
	require.Equal(t, "password", *replayEnt.ReplayTasks[0].DataTarget.Password)
	require.Equal(t, "2C4G", replayEnt.ReplayTasks[0].Resources.InstanceType)
	require.Equal(t, "2026-05-25T00:00:00Z", *replayEnt.ReplayTasks[0].PerReplayConfigs[0].ReplayStartTime)
	require.Equal(t, "UTC", replayEnt.ReplayTasks[0].PerReplayConfigs[0].CustomArguments["timezone"])
}
