package bootstrap

import (
	"os"
	"path/filepath"
	"testing"

	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
	"tercul/internal/platform/config"

	"github.com/weaviate/weaviate-go-client/v5/weaviate"
	"gorm.io/driver/sqlite"
	"gorm.io/gorm"
)

func TestNewWeaviateClient(t *testing.T) {
	cfg := &config.Config{
		WeaviateHost:   "localhost:8080",
		WeaviateScheme: "http",
	}

	client, err := NewWeaviateClient(cfg)
	require.NoError(t, err)
	assert.NotNil(t, client)
}

func TestBootstrap(t *testing.T) {
	// Skip if integration tests are not enabled
	if testing.Short() {
		t.Skip("Skipping integration test in short mode")
	}

	// Setup test database using SQLite
	dbPath := filepath.Join(t.TempDir(), "test.db")
	testDB, err := gorm.Open(sqlite.Open(dbPath), &gorm.Config{})
	require.NoError(t, err)
	defer func() {
		sqlDB, _ := testDB.DB()
		if sqlDB != nil {
			_ = sqlDB.Close()
		}
		_ = os.Remove(dbPath)
	}()

	// Setup test config
	cfg := &config.Config{
		Environment:    "test",
		WeaviateHost:   "localhost:8080",
		WeaviateScheme: "http",
	}

	// Create a mock Weaviate client (in real tests, you'd use a test container)
	weaviateClient, err := weaviate.NewClient(weaviate.Config{
		Host:   cfg.WeaviateHost,
		Scheme: cfg.WeaviateScheme,
	})
	require.NoError(t, err)

	// Test bootstrap
	deps, err := Bootstrap(cfg, testDB, weaviateClient)
	require.NoError(t, err)
	assert.NotNil(t, deps)
	assert.NotNil(t, deps.Config)
	assert.NotNil(t, deps.Database)
	assert.NotNil(t, deps.WeaviateClient)
	assert.NotNil(t, deps.Repos)
	assert.NotNil(t, deps.Application)
	assert.NotNil(t, deps.JWTManager)
	assert.NotNil(t, deps.AnalysisRepo)
	assert.NotNil(t, deps.SentimentProvider)
}

func TestBootstrapWithMetrics(t *testing.T) {
	// Skip if integration tests are not enabled
	if testing.Short() {
		t.Skip("Skipping integration test in short mode")
	}

	// Setup test database using SQLite
	dbPath := filepath.Join(t.TempDir(), "test.db")
	testDB, err := gorm.Open(sqlite.Open(dbPath), &gorm.Config{})
	require.NoError(t, err)
	defer func() {
		sqlDB, _ := testDB.DB()
		if sqlDB != nil {
			_ = sqlDB.Close()
		}
		_ = os.Remove(dbPath)
	}()

	// Setup test config
	cfg := &config.Config{
		Environment:    "test",
		WeaviateHost:   "localhost:8080",
		WeaviateScheme: "http",
	}

	// Create a mock Weaviate client
	weaviateClient, err := weaviate.NewClient(weaviate.Config{
		Host:   cfg.WeaviateHost,
		Scheme: cfg.WeaviateScheme,
	})
	require.NoError(t, err)

	// Test bootstrap with metrics
	deps, err := BootstrapWithMetrics(cfg, testDB, weaviateClient)
	require.NoError(t, err)
	assert.NotNil(t, deps)
	assert.NotNil(t, deps.Application)
}

