package main

import (
	"fmt"
	"os"
	"strconv"
	"strings"
)

func main() {
	// Очищаем тестовые данные
	os.RemoveAll("./data/test-linedb-insert")

	fmt.Println("=== LineDb Insert Operations Demo ===")

	// Получаем номера тестов из аргументов командной строки
	testNumbers := parseTestNumbers()

	// Выполняем тесты
	if len(testNumbers) == 0 {
		// Если номера не указаны, выполняем все тесты
		runAllTests()
	} else {
		// Выполняем только указанные тесты
		runSelectedTests(testNumbers)
	}

	fmt.Println("\n=== Все тесты завершены ===")
}

// parseTestNumbers парсит номера тестов из аргументов командной строки
func parseTestNumbers() []int {
	if len(os.Args) < 2 {
		return []int{}
	}

	// Получаем аргумент после имени программы
	arg := os.Args[1]

	// Проверяем, что это не флаг помощи
	if arg == "-h" || arg == "--help" || arg == "help" {
		printUsage()
		return []int{}
	}

	// Разбиваем по запятой
	parts := strings.Split(arg, ",")
	var numbers []int

	for _, part := range parts {
		part = strings.TrimSpace(part)
		if part == "" {
			continue
		}

		num, err := strconv.Atoi(part)
		if err != nil {
			fmt.Printf("Ошибка: '%s' не является числом\n", part)
			printUsage()
			return []int{}
		}

		// Проверяем диапазон
		if num < 1 || num > 8 {
			fmt.Printf("Ошибка: номер теста %d должен быть от 1 до 8\n", num)
			printUsage()
			return []int{}
		}

		numbers = append(numbers, num)
	}

	return numbers
}

// printUsage выводит справку по использованию
func printUsage() {
	fmt.Println("\nИспользование:")
	fmt.Println("  go run main.go                    # Запустить все тесты")
	fmt.Println("  go run main.go 1                  # Запустить только тест 1")
	fmt.Println("  go run main.go 1,3                # Запустить тесты 1 и 3")
	fmt.Println("  go run main.go 2,3,4              # Запустить тесты 2, 3 и 4")
	fmt.Println("  go run main.go help               # Показать эту справку")
	fmt.Println("\nДоступные тесты:")
	fmt.Println("  1 - Вставка одной записи")
	fmt.Println("  2 - Вставка массива записей")
	fmt.Println("  3 - Автоматическая генерация ID")
	fmt.Println("  4 - Партиционированные коллекции")
	fmt.Println("  5 - Проверка уникальности")
	fmt.Println("  6 - Различные типы данных")
	fmt.Println("  7 - Массовая вставка")
	fmt.Println("  8 - Множественные коллекции")
	os.Exit(0)
}

// runAllTests запускает все тесты
func runAllTests() {
	testSingleInsert()
	testArrayInsert()
	testAutoID()
	testPartitionedCollections()
	testUniquenessCheck()
	testDifferentDataTypes()
	testBulkInsert()
	testMultipleCollections()
}

// runSelectedTests запускает только выбранные тесты
func runSelectedTests(numbers []int) {
	for _, num := range numbers {
		switch num {
		case 1:
			fmt.Println("1. Вставка одной записи")
			testSingleInsert()
		case 2:
			fmt.Println("2. Вставка массива записей")
			testArrayInsert()
		case 3:
			fmt.Println("3. Автоматическая генерация ID")
			testAutoID()
		case 4:
			fmt.Println("4. Партиционированные коллекции")
			testPartitionedCollections()
		case 5:
			fmt.Println("5. Проверка уникальности")
			testUniquenessCheck()
		case 6:
			fmt.Println("6. Различные типы данных")
			testDifferentDataTypes()
		case 7:
			fmt.Println("7. Массовая вставка")
			testBulkInsert()
		case 8:
			fmt.Println("8. Множественные коллекции")
			testMultipleCollections()
		}
	}
}
