package main

import (
	"flag"
	"fmt"
	"log"
	"os"

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

/**
 * @brief Точка входа в приложение аутентификации
 *
 * Программа загружает конфигурацию, инициализирует БД
 * и запускает цикл аутентификации пользователя.
 */
func main() {
	// ---------- Работа с аргументами ----------
	configPath := flag.String(
		"config",
		"configs/config.toml",
		"Путь к конфигурационному файлу",
	)
	flag.Parse()

	// ---------- Загрузка конфигурации ----------
	cfg, err := config.Load(*configPath)
	if err != nil {
		log.Fatalf("Ошибка загрузки конфигурации: %v\n", err)
	}

	if cfg.App.Name != "" {
		fmt.Println("=== ", cfg.App.Name, " ===")
	}

	// ---------- Инициализация БД ----------
	err = db.Init(cfg.Database.Path)
	if err != nil {
		log.Fatalf("Ошибка инициализации БД: %v\n", err)
	}
	defer db.Close()

	// ---------- Основной цикл аутентификации ----------
	attempts := 0

	for {
		// Проверка лимита попыток
		if attempts >= cfg.App.MaxLoginAttempts {
			fmt.Println("Превышено количество попыток входа.")
			os.Exit(1)
		}

		// Ввод логина и пароля
		username, password, err := ui.ReadCredentials()
		if err != nil {
			fmt.Println("Ошибка ввода данных.")
			attempts++
			continue
		}

		// Проверка аутентификации
		ok, err := auth.Authenticate(username, password)
		if err != nil {
			fmt.Printf("Ошибка аутентификации: %v\n", err)
			attempts++
			continue
		}

		if ok {
			fmt.Printf("Доступ разрешён. Добро пожаловать, %s!\n", username)
			break
		} else {
			fmt.Println("Неверный логин или пароль.")
			attempts++
		}

		// Предложение очистки формы (логическое)
		if !ui.AskReset() {
			break
		}
	}

	fmt.Println("Работа приложения завершена.")
}
