package controlplane

import (
	"github.com/nexuscrm/backend/internal/application/services"
	"github.com/nexuscrm/backend/internal/infrastructure/database"
	"github.com/nexuscrm/backend/internal/infrastructure/persistence"
	"github.com/nexuscrm/backend/pkg/logging"
)

// BuildInfrastructureDeps constructs all infrastructure dependencies
// (repositories, transaction manager) from the database connection. This is
// the shared composition root used by both cmd/server and cmd/setup.
//
// EventBus is NOT set here — the caller decides:
//   - cmd/server: leaves nil → NewServiceManager creates a real EventBus
//   - controlplane.Runner: sets events.NoOpEventBus for headless mode
//
// Metrics callbacks are also left nil by default. cmd/server sets them
// from the middleware layer; the control-plane runner leaves them as no-ops.
func BuildInfrastructureDeps(db *database.TiDBConnection) services.InfrastructureDeps {
	sqlDB := db.DB()

	return services.InfrastructureDeps{
		DB:        sqlDB,
		TxManager: persistence.NewTransactionManager(db),

		UserRepo:       persistence.NewUserRepository(sqlDB),
		SystemRepo:     persistence.NewSystemRepository(sqlDB),
		BulkRepo:       persistence.NewBulkRepository(sqlDB),
		SchemaRepo:     persistence.NewSchemaRepository(sqlDB, logging.Default),
		MetadataRepo:   persistence.NewMetadataRepository(sqlDB),
		SessionRepo:    persistence.NewSessionRepository(sqlDB),
		PermissionRepo: persistence.NewPermissionRepository(sqlDB),
		OAuthRepo:      persistence.NewOAuthRepository(sqlDB),
		QueryRepo:      persistence.NewQueryRepository(sqlDB),
		RecordRepo:     persistence.NewRecordRepository(sqlDB),
		OutboxRepo:     persistence.NewOutboxRepository(sqlDB),
		RollupRepo:     persistence.NewRollupRepository(sqlDB),
	}
}
