package main

import (
	"fmt"
	"os"
	"time"

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

func main() {
	fmt.Println("=== LineDB Debug Test ===")

	// Очищаем тестовую папку
	fmt.Println("1. Очистка тестовой папки...")
	os.RemoveAll("./testdata")

	// Создаем опции инициализации
	fmt.Println("2. Создание опций инициализации...")
	initOptions := &linedb.LineDbInitOptions{
		CacheSize: 100,
		CacheTTL:  time.Minute,
		DBFolder:  "./testdata",
		Collections: []linedb.JSONLFileOptions{
			{
				CollectionName: "test",
				AllocSize:      256,
			},
		},
	}

	fmt.Printf("   CacheSize: %d\n", initOptions.CacheSize)
	fmt.Printf("   CacheTTL: %v\n", initOptions.CacheTTL)
	fmt.Printf("   DBFolder: %s\n", initOptions.DBFolder)
	fmt.Printf("   Collections: %d\n", len(initOptions.Collections))

	// Создаем базу данных
	fmt.Println("3. Создание базы данных...")
	db := linedb.NewLineDb(nil)
	defer func() {
		fmt.Println("9. Закрытие базы данных...")
		db.Close()
	}()

	fmt.Printf("   DB создан: %v\n", db != nil)

	// Инициализируем базу данных
	fmt.Println("4. Инициализация базы данных...")
	if err := db.Init(false, initOptions); err != nil {
		fmt.Printf("   ОШИБКА: %v\n", err)
		return
	}

	fmt.Println("   База данных инициализирована успешно!")

	// Тест вставки
	fmt.Println("5. Тест вставки данных...")
	testData := map[string]any{
		"name":  "test",
		"value": 123,
		"debug": true,
	}

	fmt.Printf("   Вставляемые данные: %+v\n", testData)

	if err := db.Insert(testData, "test", linedb.LineDbAdapterOptions{}); err != nil {
		fmt.Printf("   ОШИБКА при вставке: %v\n", err)
		return
	}

	fmt.Println("   Данные вставлены успешно!")

	// Тест чтения
	fmt.Println("6. Тест чтения данных...")
	allData, err := db.Read("test", linedb.LineDbAdapterOptions{})
	if err != nil {
		fmt.Printf("   ОШИБКА при чтении: %v\n", err)
		return
	}

	fmt.Printf("   Прочитано записей: %d\n", len(allData))
	for i, record := range allData {
		fmt.Printf("   Запись %d: %+v\n", i+1, record)
	}

	if len(allData) != 1 {
		fmt.Printf("   ОШИБКА: Ожидалось 1 запись, получено %d\n", len(allData))
		return
	}

	// Тест фильтрации
	fmt.Println("7. Тест фильтрации...")
	filter := map[string]any{"name": "test"}
	fmt.Printf("   Фильтр: %+v\n", filter)

	filteredData, err := db.ReadByFilter(filter, "test", linedb.LineDbAdapterOptions{})
	if err != nil {
		fmt.Printf("   ОШИБКА при фильтрации: %v\n", err)
		return
	}

	fmt.Printf("   Отфильтровано записей: %d\n", len(filteredData))
	for i, record := range filteredData {
		fmt.Printf("   Отфильтрованная запись %d: %+v\n", i+1, record)
	}

	// Тест обновления
	fmt.Println("8. Тест обновления...")
	updateData := map[string]any{"value": 456, "updated": true}
	updateFilter := map[string]any{"name": "test"}

	fmt.Printf("   Данные для обновления: %+v\n", updateData)
	fmt.Printf("   Фильтр обновления: %+v\n", updateFilter)

	updatedData, err := db.Update(updateData, "test", updateFilter, linedb.LineDbAdapterOptions{})
	if err != nil {
		fmt.Printf("   ОШИБКА при обновлении: %v\n", err)
		return
	}

	fmt.Printf("   Обновлено записей: %d\n", len(updatedData))
	for i, record := range updatedData {
		fmt.Printf("   Обновленная запись %d: %+v\n", i+1, record)
	}

	// Проверяем результат обновления
	fmt.Println("9. Проверка результата обновления...")
	finalData, err := db.Read("test", linedb.LineDbAdapterOptions{})
	if err != nil {
		fmt.Printf("   ОШИБКА при финальном чтении: %v\n", err)
		return
	}

	fmt.Printf("   Финальное количество записей: %d\n", len(finalData))
	for i, record := range finalData {
		fmt.Printf("   Финальная запись %d: %+v\n", i+1, record)
	}

	fmt.Println("=== Все тесты прошли успешно! ===")
}
