package linuxmodules

import (
	"fmt"
	"rubric/utils"
	"strings"
)

// Module описывает один раздел справочника Linux
type Module struct {
	Key         string
	Aliases     []string
	Title       string
	Description string
	Run         func()
}

// All — список всех модулей в порядке меню
var All = []Module{
	IntroModule,
	FilesModule,
	StreamsModule,
	BashModule,
	ProcessesModule,
	UsersModule,
	KernelModule,
	DisksModule,
	ScriptsModule,
	BootModule,
	LogsModule,
	BackupModule,
	NetworkModule,
	SecurityModule,
	PackagesModule,
	PerformanceModule,
	SysconfigModule,
	NetfsModule,
	ToolsModule,
}

// Find ищет модуль по ключу или алиасу
func Find(key string) (Module, bool) {
	key = strings.ToLower(strings.TrimSpace(key))
	for _, m := range All {
		if m.Key == key {
			return m, true
		}
		for _, a := range m.Aliases {
			if a == key {
				return m, true
			}
		}
	}
	return Module{}, false
}

// ListModules выводит краткий список модулей
func ListModules() {
	fmt.Printf("\n%s%sРазделы справочника Linux:%s\n\n",
		utils.ColorBold, utils.ColorCyan, utils.ColorReset)
	for i, m := range All {
		fmt.Printf("  %s%d.%s %-12s — %s\n",
			utils.ColorDim, i+1, utils.ColorReset,
			utils.ColorYellow+utils.ColorBold+m.Key+utils.ColorReset,
			m.Title,
		)
	}
	fmt.Println()
}

// Keywords возвращает ключевые слова для поиска по модулю
func Keywords(key string) []string {
	kw := map[string][]string{
		"intro":       {"операционная система", "GNU", "Linux", "дистрибутив", "FHS", "файловая система", "терминал", "shell", "bash", "история"},
		"files":       {"файлы", "директории", "ls", "cp", "mv", "rm", "mkdir", "ln", "symlink", "жёсткая ссылка", "grep", "find", "cat", "head", "tail", "nano", "vim", "vi", "less", "chmod"},
		"streams":     {"stdin", "stdout", "stderr", "pipe", "перенаправление", "redirect", "tee", "xargs", "dev/null", "конвейер"},
		"bash":        {"bash", "alias", "history", "переменные", "PATH", "HOME", "bashrc", "completion", "type", "which", "окружение", "environment"},
		"processes":   {"процессы", "ps", "top", "htop", "kill", "signals", "сигналы", "PID", "nice", "renice", "jobs", "bg", "fg", "nohup", "watch"},
		"users":       {"пользователи", "группы", "sudo", "su", "chmod", "chown", "права", "permissions", "useradd", "usermod", "passwd", "visudo", "sudoers", "SUID", "SGID", "umask"},
		"kernel":      {"ядро", "kernel", "uname", "dmesg", "модули", "modules", "lsmod", "modprobe", "sysctl", "lscpu", "lspci"},
		"disks":       {"диски", "разделы", "fdisk", "parted", "mkfs", "mount", "fstab", "LVM", "RAID", "mdadm", "ext4", "xfs", "swap", "blkid", "df", "du"},
		"scripts":     {"скрипты", "bash scripting", "if", "for", "while", "функции", "массивы", "getopts", "trap", "set -e", "shebang"},
		"boot":        {"загрузка", "GRUB", "systemd", "systemctl", "journalctl", "сервисы", "юниты", "units", "target", "timer", "boot"},
		"logs":        {"логи", "логирование", "rsyslog", "syslog", "logrotate", "cron", "crontab", "at", "journald", "var/log"},
		"backup":      {"бэкап", "резервное копирование", "tar", "rsync", "инкрементальный", "VDO", "дедупликация"},
		"network":     {"сеть", "сети", "ip", "ifconfig", "ss", "netstat", "nmcli", "SSH", "ключи", "авторизация", "firewall", "ping", "traceroute", "curl", "wget", "порты"},
		"security":    {"безопасность", "SELinux", "firewalld", "firewall-cmd", "восстановление", "semanage", "chcon", "restorecon", "audit"},
		"packages":    {"пакеты", "dnf", "apt", "rpm", "dpkg", "репозиторий", "установка", "snap", "flatpak", "yum"},
		"performance": {"производительность", "swap", "память", "RAM", "OOM", "планировщик", "nice", "tuned", "Stratis", "swappiness"},
		"sysconfig":   {"RHEL", "hostname", "время", "NTP", "chrony", "часовой пояс", "timedatectl", "localectl", "subscription-manager"},
		"netfs":       {"NFS", "SMB", "Samba", "CIFS", "autofs", "монтирование", "сетевые диски", "IPv6", "rsync", "SCP", "SFTP"},
		"tools":       {"Cockpit", "glob", "регулярные выражения", "regex", "grep", "sed", "awk", "глоббинг", "веб-интерфейс"},
	}
	if v, ok := kw[key]; ok {
		return v
	}
	return []string{}
}
