//go:build integration

package uiapi

import (
	"context"
	"testing"

	"github.com/nexuscrm/backend/internal/features/metadata"
	"github.com/nexuscrm/backend/internal/features/permissions"
	"github.com/nexuscrm/backend/internal/infrastructure/database"
	"github.com/nexuscrm/backend/internal/infrastructure/persistence"
	"github.com/nexuscrm/backend/pkg/logging"
)

// SetupIntegrationTest initializes a database connection and basic services for integration testing.
func SetupIntegrationTest(t *testing.T) (*database.TiDBConnection, *metadata.MetadataService, *permissions.PermissionService, *Service) {
	if testing.Short() {
		t.Skip("Skipping integration test in short mode")
	}

	conn, err := database.GetInstance()
	if err != nil {
		t.Skip("Database not available: " + err.Error())
	}

	db := conn.DB()

	// Repos
	schemaRepo := persistence.NewSchemaRepository(db, nil)
	repo := persistence.NewMetadataRepository(db)
	permRepo := persistence.NewPermissionRepository(db)
	userRepo := persistence.NewUserRepository(db)
	// recordRepo := persistence.NewRecordRepository(db)

	// metadata service
	sm := metadata.NewSchemaManager(schemaRepo)
	ms := metadata.NewMetadataService(repo, sm, nil) // EventBus nil for test

	// perm service
	ps := permissions.NewPermissionService(permRepo, ms, userRepo)

	// persistence service needed for Service? No, UIAPI Service takes PersistenceService but apps.go uses metadata/perm mainly.
	// Wait, uiapi.NewService signature: (persistence, metadata, permissions, logger)
	// We need a persistence service or nil if not used by CreateObjectWithApp

	// Persistence Service construction is complex (requires rollup, validation etc).
	// Let's pass nil for Persistence if apps.go doesn't use it.
	// apps.go uses: metadataSvc, permSvc.
	// It doesn't use persistence directly.

	logger := logging.New(context.Background())

	svc := NewService(nil, ms, ps, logger)

	// Clean up any previous test data if needed?
	// The tests should use unique IDs.

	return conn, ms, ps, svc
}
