package impl

import (
	"github.com/tidbcloud/dataflow-service/app/internal/feature_gate"
	"github.com/tidbcloud/dataflow-service/app/models/backup"
	baseRepo "github.com/tidbcloud/dataflow-service/app/repo"
	backupRepo "github.com/tidbcloud/dataflow-service/app/repo/backup"
	restoreRepo "github.com/tidbcloud/dataflow-service/app/repo/restore"
	"github.com/tidbcloud/dataflow-service/app/workflow"
	"github.com/tidbcloud/dataflow-service/pkg/blob"
	"github.com/tidbcloud/dataflow-service/pkg/grpc/grpcli"
	"github.com/tidbcloud/pkgv2/db"
)

// NewPitBackupModelWithStorageFunc creates a pitBackupModel with injectable getStorageFunc for testing.
// IMPORTANT: This is test-only infrastructure but MUST be in a non-test file because
// Go does not allow _test.go files to export symbols to external test packages in different directories.
// External tests (e.g., backup_test/) need this function, so it must be in a regular .go file.
// DO NOT remove or rename this file without also updating all external test packages that depend on it.
func NewPitBackupModelWithStorageFunc(
	dbProvider db.TransProvider,
	pitBackupSwitchRepo backupRepo.PitBackupSwitchRepo,
	logBackupRepo backupRepo.LogBackupRepo,
	backupRepo backupRepo.BackupRepo,
	restoreRepo restoreRepo.RestoreRepo,
	workflowCli workflow.Workflow,
	coreCli grpcli.CoreGrpcClient,
	mgmtCli grpcli.MgmtSvcGrpcClient,
	snapshotBackupModel backup.SnapshotBackupModel,
	backupSettingModel backup.BackupSettingModel,
	scheduleRepo backupRepo.BackupScheduleRepo,
	featureGate feature_gate.FeatureGate,
	bucketRepo baseRepo.BucketRepo,
	getStorageFunc blob.GetStorageFunc,
) backup.PitBackupModel {
	m := NewPitBackupModel(
		dbProvider,
		pitBackupSwitchRepo,
		logBackupRepo,
		backupRepo,
		restoreRepo,
		bucketRepo,
		workflowCli,
		coreCli,
		mgmtCli,
		snapshotBackupModel,
		backupSettingModel,
		scheduleRepo,
		featureGate,
	)
	if getStorageFunc != nil {
		m.(*pitBackupModel).getStorageFunc = getStorageFunc
	}
	return m
}
