package linuxmodules

import (
	"fmt"
	"rubric/utils"
)

var IntroModule = Module{
	Key:         "intro",
	Aliases:     []string{"i", "os", "начало"},
	Title:       "Введение. ОС и GNU/Linux",
	Description: "Темы 01, 04, 05: операционные системы, файловые системы, терминал",
	Run:         showIntro,
}

func showIntro() {
	utils.Header("Linux — Введение. ОС и GNU/Linux")

	// ─── 01. Операционные системы и GNU/Linux ─────────────────────
	utils.Section("01. Операционные системы и GNU/Linux")

	utils.Println("Операционная система (ОС) — программа, управляющая аппаратурой и")
	utils.Println("предоставляющая среду для работы прикладных программ.")
	fmt.Println()
	utils.Println(utils.ColorBold + "Ключевые понятия:" + utils.ColorReset)
	utils.Code(`Ядро (kernel)   — центральная часть ОС, управляет памятью,
                  процессами, устройствами.
Userspace       — пространство пользователя, где работают
                  обычные программы.
Дистрибутив     — ядро Linux + набор программ + система управления
                  пакетами (Debian, Ubuntu, RHEL, Fedora, Arch...).`)

	utils.Println(utils.ColorBold + "История:" + utils.ColorReset)
	utils.Code(`1969  — AT&T Bell Labs: UNIX (Ричи, Томпсон)
1983  — Ричард Столлман: проект GNU (свободное ПО)
1991  — Линус Торвальдс: ядро Linux (v0.01)
       = GNU/Linux: ядро Linux + утилиты GNU
POSIX — стандарт совместимости UNIX-подобных систем`)

	utils.Println(utils.ColorBold + "GNU/Linux vs другие ОС:" + utils.ColorReset)
	utils.Code(`Linux            Windows         macOS
─────────────────────────────────────────────
Открытый код     Закрытый         Частично открытый
Бесплатно        Платный          Платный (только на Mac)
Пакетный менеджер Магазин/exe     App Store/Homebrew
Множество дистро Одна система     Одна система
Сильный CLI      GUI-ориентирован CLI через zsh/bash`)

	utils.Note("Серверы: >90% работают на Linux. Android — ядро Linux. Суперкомпьютеры: 100% Linux.")
	utils.Note("RHEL (Red Hat Enterprise Linux) — коммерческий дистрибутив; RHCSA — его сертификация.")

	// ─── 04. О файловых системах ──────────────────────────────────
	utils.Section("04. О файловых системах")

	utils.Println("Файловая система (ФС) — способ организации хранения данных на диске.")
	fmt.Println()
	utils.Println(utils.ColorBold + "Популярные файловые системы Linux:" + utils.ColorReset)
	utils.Code(`ext4    — стандарт для большинства дистрибутивов,
          журналирование, поддержка файлов до 16 ТБ
xfs     — высокая производительность, RHEL по умолчанию,
          хорошо для больших файлов
btrfs   — Copy-on-Write, снапшоты, сжатие
vfat    — совместимость с Windows (флешки, EFI-раздел)
ntfs    — чтение/запись Windows-разделов (ntfs-3g)
tmpfs   — виртуальная ФС в оперативной памяти (/tmp, /run)
proc    — виртуальная ФС, информация о процессах (/proc)
sysfs   — виртуальная ФС, информация об устройствах (/sys)`)

	utils.Println(utils.ColorBold + "Структура файловой системы Linux (FHS):" + utils.ColorReset)
	utils.Code(`/           — корень, начало всего дерева
├── bin/    — основные бинарные файлы (ls, cp, mv...)
├── sbin/   — системные бинарники (root: fdisk, mount...)
├── etc/    — конфигурационные файлы
├── home/   — домашние директории пользователей
├── root/   — домашняя директория root
├── var/    — изменяемые данные (логи, кэш, БД)
├── tmp/    — временные файлы (очищается при перезагрузке)
├── usr/    — пользовательские программы и данные
│   ├── bin/    — программы пользователя
│   ├── lib/    — библиотеки
│   └── share/  — разделяемые данные
├── lib/    — системные библиотеки
├── dev/    — файлы устройств (sda, tty, null...)
├── proc/   — виртуальная ФС: инфо о процессах и ядре
├── sys/    — виртуальная ФС: инфо об устройствах
├── run/    — данные запущенных процессов (PID-файлы)
├── boot/   — загрузчик, ядро (vmlinuz, initrd)
├── mnt/    — точки монтирования (временные)
└── media/  — автомонтирование съёмных носителей`)

	utils.Note("В Linux всё — файл: устройства, сокеты, каналы, процессы.")
	utils.Note("Нет буквы диска (C:, D:). Всё монтируется в единое дерево с корнем /")

	utils.Println(utils.ColorBold + "Типы файлов:" + utils.ColorReset)
	utils.Code(`-  обычный файл          (ls показывает -)
d  директория            (ls показывает d)
l  символическая ссылка  (ls показывает l)
b  блочное устройство    (/dev/sda)
c  символьное устройство (/dev/tty)
p  именованный канал     (FIFO)
s  сокет`)

	// ─── 05. Текстовый интерфейс пользователя ────────────────────
	utils.Section("05. Текстовый интерфейс пользователя (CLI)")

	utils.Println("Shell (оболочка) — интерпретатор команд между пользователем и ядром.")
	fmt.Println()
	utils.Println(utils.ColorBold + "Оболочки:" + utils.ColorReset)
	utils.Code(`bash  — Bourne Again Shell, стандарт в большинстве дистро
zsh   — расширенный bash, Oh My Zsh, популярен у разработчиков
sh    — POSIX sh (минималистичный, для скриптов)
fish  — дружелюбный, автодополнение из коробки`)

	utils.Println(utils.ColorBold + "Приглашение командной строки (prompt):" + utils.ColorReset)
	utils.Code(`user@hostname:~$     — обычный пользователь
root@hostname:~#     — суперпользователь (root)

user    — имя пользователя
hostname — имя машины
~       — текущая директория (~ = домашняя)
$       — не root; # — root`)

	utils.Println(utils.ColorBold + "Базовые горячие клавиши:" + utils.ColorReset)
	utils.Code(`Tab          — автодополнение команд и путей
Tab Tab      — показать все варианты
↑ / ↓        — история команд
Ctrl+C       — прервать текущую команду (SIGINT)
Ctrl+Z       — приостановить процесс (SIGTSTP)
Ctrl+D       — закрыть сессию / конец ввода (EOF)
Ctrl+L       — очистить экран (= clear)
Ctrl+A       — в начало строки
Ctrl+E       — в конец строки
Ctrl+R       — поиск по истории команд
Ctrl+U       — удалить строку до курсора
Ctrl+W       — удалить слово влево`)

	utils.Println(utils.ColorBold + "Полезные команды общего назначения:" + utils.ColorReset)
	utils.Command("man команда", "страница руководства (q — выход, /текст — поиск)")
	utils.Command("info команда", "расширенная документация GNU")
	utils.Command("команда --help", "краткая справка")
	utils.Command("type команда", "что такое команда (alias/builtin/файл)")
	utils.Command("which команда", "полный путь к исполняемому файлу")
	utils.Command("whereis команда", "бинарник, исходник и man-страница")
	utils.Command("history", "история команд")
	utils.Command("history 20", "последние 20 команд")
	utils.Command("!42", "выполнить команду №42 из истории")
	utils.Command("!!", "повторить последнюю команду")
	utils.Command("clear", "очистить экран")
	utils.Command("exit", "выйти из сессии")
	utils.Command("echo $SHELL", "какая оболочка используется")
	fmt.Println()
	utils.Code(`# Запуск нескольких команд:
cmd1 ; cmd2       — выполнить последовательно (всегда)
cmd1 && cmd2      — cmd2 только если cmd1 успешна
cmd1 || cmd2      — cmd2 только если cmd1 неуспешна
cmd1 | cmd2       — передать вывод cmd1 на вход cmd2 (pipe)`)

	utils.Note("Виртуальные консоли: Alt+F1..F6 в Linux. В X11 — Ctrl+Alt+F1..F6. Вернуться: Ctrl+Alt+F7.")

	utils.Footer()
}
