package myfuzz

import (
	"bytes"

	"linux-auth/internal/auth"
	"linux-auth/internal/db"
)

// Fuzz — это функция, которую будет вызывать go-fuzz.
// Принимает только []byte — все входные данные в одном байтовом потоке.
func Fuzz(data []byte) int {
	// Инициализируем БД на каждом вызове — go-fuzz не имеет f.Cleanup()
	if err := db.Init("test_data.db"); err != nil {
		return -1 // ошибка инициализации — краш
	}
	defer db.Close() // закрываем после каждого вызова

	// Разделяем байты по нулевому байту (\x00) — это разделитель между username и password
	parts := bytes.SplitN(data, []byte{0}, 2)
	if len(parts) != 2 {
		return 0 // недостаточно данных — пропускаем
	}

	username := string(parts[0])
	password := string(parts[1])

	ok, err := auth.Authenticate(username, password)

	// Если произошла ошибка — это баг
	if err != nil {
		return -1 // краш
	}

	// Если аутентификация прошла успешно — проверяем, разрешён ли такой вход
	if ok {
		// Разрешённые пары (аналогично f.Add)
		if (username == "admin" && password == "admin123") ||
			(username == "user1" && password == "password1") {
			return 1 // норма — это ожидаемый результат
		}
		// Неожиданный успешный вход — это баг!
		return -1 // краш
	}

	// Неудачная аутентификация — это нормально
	return 1 // норма
}
