package catalog

import (
	"bufio"
	"fmt"
	"rubric/modules/linuxmodules"
	"rubric/utils"
	"strconv"
	"strings"
)

// LinuxBook — запись справочника Linux в главном меню
var LinuxBook = Book{
	Key:         "linux",
	Aliases:     []string{"l", "lnx"},
	Title:       "Справочник по GNU/Linux",
	Description: "Основы GNU/Linux: файлы, процессы, сети, systemd, bash-скрипты и многое другое",
	Run:         runLinuxBook,
}

func runLinuxBook(scanner *bufio.Scanner) {
	for {
		showLinuxMenu()

		input, ok := ReadLine(scanner)
		if !ok {
			return
		}
		if input == "" {
			continue
		}
		if IsQuit(input) {
			fmt.Printf("\n  %s%sДо свидания!%s\n\n",
				utils.ColorBold, utils.ColorCyan, utils.ColorReset)
			return
		}
		if IsBack(input) {
			return
		}

		// По номеру
		if n, err := strconv.Atoi(input); err == nil {
			if n >= 1 && n <= len(linuxmodules.All) {
				linuxmodules.All[n-1].Run()
				if waitLinuxBack(scanner) {
					return
				}
				continue
			}
			fmt.Printf("\n  %s%sНомер %d вне диапазона (1–%d)%s\n",
				utils.ColorBold, utils.ColorRed, n, len(linuxmodules.All), utils.ColorReset)
			continue
		}

		// По ключу
		if m, ok := linuxmodules.Find(input); ok {
			m.Run()
			if waitLinuxBack(scanner) {
				return
			}
			continue
		}

		fmt.Printf("\n  %s%sНе понял '%s'. Номер, ключ раздела, b — назад.%s\n",
			utils.ColorBold, utils.ColorRed, input, utils.ColorReset)
	}
}

func showLinuxMenu() {
	utils.Header("Справочник GNU/Linux")

	fmt.Printf("  %s%sРазделы:%s\n\n",
		utils.ColorBold, utils.ColorWhite, utils.ColorReset)

	for i, m := range linuxmodules.All {
		aliases := ""
		if len(m.Aliases) > 0 {
			aliases = fmt.Sprintf("%s  [%s]%s",
				utils.ColorDim, strings.Join(m.Aliases, ", "), utils.ColorReset)
		}
		fmt.Printf("  %s%s %2d.%s  %s%-12s%s  %s%-30s%s%s\n",
			utils.ColorBold, utils.ColorCyan, i+1, utils.ColorReset,
			utils.ColorYellow+utils.ColorBold, m.Key, utils.ColorReset,
			utils.ColorWhite, m.Title, utils.ColorReset,
			aliases,
		)
		fmt.Printf("        %s%s%s\n\n",
			utils.ColorDim, m.Description, utils.ColorReset)
	}

	fmt.Printf("  %s%sРаздел (номер / ключ / b — главное меню / q — выход):%s ",
		utils.ColorBold, utils.ColorGreen, utils.ColorReset)
}

func waitLinuxBack(scanner *bufio.Scanner) bool {
	fmt.Printf("\n  %s%s[Enter — назад в меню Linux, b — главное меню]%s ",
		utils.ColorDim, utils.ColorCyan, utils.ColorReset)
	if scanner.Scan() {
		return IsBack(strings.TrimSpace(scanner.Text()))
	}
	return false
}
