// Тест: ошибка при записи, превышающей allocSize-1.
// Запуск: go run ./examples/test-alloc-overflow/main.go
// Файлы остаются в ./data/test-alloc-overflow/
package main

import (
	"fmt"
	"log"
	"os"
	"strings"
	"time"

	"direct-dev.ru/gitea/GiteaAdmin/elowdb-go/pkg/linedb"
)

func main() {
	dataDir := "./data/test-alloc-overflow"
	os.MkdirAll(dataDir, 0755)

	initOptions := &linedb.LineDbInitOptions{
		CacheSize: 100,
		CacheTTL:  time.Minute,
		DBFolder:  dataDir,
		Collections: []linedb.JSONLFileOptions{
			{CollectionName: "tiny", AllocSize: 64},
		},
	}

	db := linedb.NewLineDb(nil)
	if err := db.Init(false, initOptions); err != nil {
		log.Fatalf("Init failed: %v", err)
	}
	defer db.Close()

	opts := linedb.LineDbAdapterOptions{}

	// Короткая запись — должна пройти
	fmt.Println("1. Insert короткой записи...")
	if err := db.Insert(map[string]any{"x": "short"}, "tiny", opts); err != nil {
		log.Fatalf("Insert short failed: %v", err)
	}
	fmt.Println("   OK")

	// Длинная — ожидаем ошибку
	fmt.Println("2. Insert длинной записи (ожидаем ошибку)...")
	longStr := strings.Repeat("a", 80)
	err := db.Insert(map[string]any{"x": longStr}, "tiny", opts)
	if err == nil {
		log.Fatal("Ожидалась ошибка, но Insert прошёл")
	}
	fmt.Printf("   Ошибка (ожидаемо): %v\n", err)
	if !strings.Contains(err.Error(), "exceeds") {
		log.Fatalf("Ожидалось 'exceeds' в ошибке, получено: %v", err)
	}
	fmt.Println("   OK — ошибка корректная")

	// Итог
	all, _ := db.Read("tiny", opts)
	fmt.Printf("\nЗаписей в коллекции после insert-теста: %d\n", len(all))

	//короткий update
	fmt.Println("\n3. Update с коротким значением...")
	_, err = db.Update(
		map[string]any{"x": "short"},
		"tiny",
		map[string]any{"x": "short"},
		opts,
	)
	if err != nil {
		log.Fatalf("Update short failed: %v", err)
	}
	fmt.Println("   OK")

	// Длинный update — ожидаем ошибку при переписывании файла
	fmt.Println("\n4. Update с длинным значением (ожидаем ошибку)...")
	longUpdate := strings.Repeat("b", 80)
	_, err = db.Update(
		map[string]any{"x": longUpdate},
		"tiny",
		map[string]any{"x": "short"},
		opts,
	)
	if err == nil {
		log.Fatal("Ожидалась ошибка, но Update прошёл")
	}
	fmt.Printf("   Ошибка (ожидаемо): %v\n", err)
	if !strings.Contains(err.Error(), "exceeds") {
		log.Fatalf("Ожидалось 'exceeds' в ошибке, получено: %v", err)
	}
	fmt.Println("   OK — ошибка при update корректная")

	all, _ = db.Read("tiny", opts)
	fmt.Printf("\nЗаписей в коллекции после update-теста: %d\n", len(all))
	fmt.Printf("Файл сохранён: %s/tiny.jsonl\n", dataDir)
}
