package commands

import (
	"context"
	"testing"

	"github.com/stretchr/testify/assert"
	"tercul/internal/domain"
)

func TestMigrateTranslations_EmptyData(t *testing.T) {
	index := initBleveIndexForTest(t)
	defer func() { _ = index.Close() }()

	repo := &mockTranslationRepository{translations: []domain.Translation{}}
	logger := getTestLogger()

	stats, err := migrateTranslations(
		context.Background(),
		repo,
		index,
		10,
		nil,
		logger,
	)

	assert.NoError(t, err)
	assert.NotNil(t, stats)
	assert.Equal(t, 0, stats.TotalIndexed)
	assert.Equal(t, 0, stats.TotalErrors)
}

func TestMigrateTranslations_LargeBatch(t *testing.T) {
	index := initBleveIndexForTest(t)
	defer func() { _ = index.Close() }()

	// Create 100 translations
	translations := make([]domain.Translation, 100)
	for i := 0; i < 100; i++ {
		translations[i] = domain.Translation{
			BaseModel: domain.BaseModel{ID: uint(i + 1)},
			Title:     "Test Translation",
			Content:   "Content",
			Language:  "en",
			Status:    domain.TranslationStatusPublished,
			TranslatableID:   uint(i + 1),
			TranslatableType: "works",
		}
	}

	repo := &mockTranslationRepository{translations: translations}
	logger := getTestLogger()

	stats, err := migrateTranslations(
		context.Background(),
		repo,
		index,
		50, // Batch size smaller than total
		nil,
		logger,
	)

	assert.NoError(t, err)
	assert.NotNil(t, stats)
	assert.Equal(t, 100, stats.TotalIndexed)
	assert.Equal(t, 0, stats.TotalErrors)
}

func TestMigrateTranslations_RepositoryError(t *testing.T) {
	index := initBleveIndexForTest(t)
	defer func() { _ = index.Close() }()

	repo := &mockTranslationRepository{
		translations: []domain.Translation{},
		err:          assert.AnError,
	}
	logger := getTestLogger()

	stats, err := migrateTranslations(
		context.Background(),
		repo,
		index,
		10,
		nil,
		logger,
	)

	assert.Error(t, err)
	assert.Nil(t, stats)
}

func TestIndexBatch_EmptyBatch(t *testing.T) {
	index := initBleveIndexForTest(t)
	defer func() { _ = index.Close() }()

	err := indexBatch(index, []domain.Translation{})
	assert.NoError(t, err) // Empty batch should not error
}

func TestIndexBatch_WithTranslatorID(t *testing.T) {
	index := initBleveIndexForTest(t)
	defer func() { _ = index.Close() }()

	translatorID := uint(123)
	translations := []domain.Translation{
		{
			BaseModel: domain.BaseModel{ID: 1},
			Title:     "Test",
			Content:   "Content",
			Language:  "en",
			Status:    domain.TranslationStatusPublished,
			TranslatableID:   100,
			TranslatableType: "works",
			TranslatorID:     &translatorID,
		},
	}

	err := indexBatch(index, translations)
	assert.NoError(t, err)

	// Verify document is indexed
	doc, err := index.Document("translation_1")
	assert.NoError(t, err)
	assert.NotNil(t, doc)
}

func TestCheckpoint_InvalidJSON(t *testing.T) {
	// Test loading invalid checkpoint file
	// This would require mocking file system, but for now we test the happy path
	// Invalid JSON handling is tested implicitly through file operations
}

