package linuxmodules

import (
	"fmt"
	"rubric/utils"
)

var FilesModule = Module{
	Key:         "files",
	Aliases:     []string{"f", "dirs", "файлы"},
	Title:       "Файлы и директории",
	Description: "Темы 06–10: пути, cp/mv/rm, ссылки, чтение файлов, nano и vi",
	Run:         showFiles,
}

func showFiles() {
	utils.Header("Linux — Файлы и директории")

	// ─── 06. Пути и директории ────────────────────────────────────
	utils.Section("06. Пути и директории")

	utils.Println(utils.ColorBold + "Абсолютный и относительный пути:" + utils.ColorReset)
	utils.Code(`Абсолютный: начинается с /
  /home/user/documents/file.txt

Относительный: относительно текущей директории
  documents/file.txt   (из /home/user)
  ../другой/файл       (.. — родительская директория)
  ./скрипт.sh          (. — текущая директория)`)

	utils.Println(utils.ColorBold + "Специальные обозначения:" + utils.ColorReset)
	utils.Code(`.     — текущая директория
..    — родительская директория
~     — домашняя директория текущего пользователя
~/   — то же самое, используется в путях: ~/docs
-     — предыдущая директория (cd -)`)

	utils.Println(utils.ColorBold + "Навигация:" + utils.ColorReset)
	utils.Command("pwd", "показать текущую директорию (Print Working Directory)")
	utils.Command("cd /etc", "перейти в /etc (абсолютный путь)")
	utils.Command("cd docs", "перейти в docs (относительный)")
	utils.Command("cd ..", "перейти в родительскую директорию")
	utils.Command("cd ~", "перейти домой")
	utils.Command("cd -", "вернуться в предыдущую директорию")
	utils.Command("cd", "то же что cd ~")
	fmt.Println()
	utils.Println(utils.ColorBold + "Просмотр содержимого:" + utils.ColorReset)
	utils.Command("ls", "список файлов текущей директории")
	utils.Command("ls -l", "длинный формат (права, владелец, размер, дата)")
	utils.Command("ls -a", "все файлы включая скрытые (начинаются с .)")
	utils.Command("ls -la", "длинный формат + скрытые")
	utils.Command("ls -lh", "размер в читаемом виде (K, M, G)")
	utils.Command("ls -lt", "сортировка по времени (новые сверху)")
	utils.Command("ls -ltr", "по времени в обратном порядке")
	utils.Command("ls -R", "рекурсивно (все вложенные)")
	utils.Command("ls /etc/*.conf", "glob-паттерн: все .conf в /etc")
	fmt.Println()
	utils.Code(`# Пример вывода ls -l:
drwxr-xr-x 2 alice users 4096 Jan 15 10:30 docs
-rw-r--r-- 1 alice users  512 Jan 14 09:00 file.txt
lrwxrwxrwx 1 alice users    7 Jan 13 12:00 link -> file.txt
│           │ │     │     │    │             │
│           │ │     │     │    │             └ имя файла
│           │ │     │     │    └ дата изменения
│           │ │     │     └ размер (байты)
│           │ │     └ группа
│           │ └ владелец
│           └ количество жёстких ссылок
└ тип и права доступа`)

	utils.Println(utils.ColorBold + "Создание директорий:" + utils.ColorReset)
	utils.Command("mkdir mydir", "создать директорию")
	utils.Command("mkdir -p a/b/c", "создать вложенные директории")
	utils.Command("mkdir -p project/{src,docs,tests}", "создать несколько сразу")
	utils.Command("rmdir mydir", "удалить пустую директорию")

	// ─── 07. Создание и копирование файлов ───────────────────────
	utils.Section("07. Создание и копирование файлов")

	utils.Println(utils.ColorBold + "Создание файлов:" + utils.ColorReset)
	utils.Command("touch file.txt", "создать пустой файл / обновить время доступа")
	utils.Command("touch file{1..5}.txt", "создать file1.txt … file5.txt")
	utils.Command("> file.txt", "создать пустой файл / очистить существующий")
	utils.Command("echo 'текст' > file.txt", "записать текст в файл")
	utils.Command("echo 'текст' >> file.txt", "добавить текст в конец файла")
	fmt.Println()
	utils.Println(utils.ColorBold + "Копирование (cp):" + utils.ColorReset)
	utils.Command("cp src dst", "скопировать файл")
	utils.Command("cp -r src/ dst/", "скопировать директорию рекурсивно")
	utils.Command("cp -v src dst", "показать что копируется (-v = verbose)")
	utils.Command("cp -i src dst", "спросить при перезаписи (-i = interactive)")
	utils.Command("cp -p src dst", "сохранить права/метаданные (-p = preserve)")
	utils.Command("cp -a src/ dst/", "архивный режим: -r + -p + символические ссылки")
	utils.Command("cp *.txt /tmp/", "копировать все .txt в /tmp")
	fmt.Println()
	utils.Note("cp -r не сохраняет права и время по умолчанию. Для резервного копирования используйте cp -a.")

	// ─── 08. Перемещение, удаление, ссылки ───────────────────────
	utils.Section("08. Перемещение, переименование, удаление. Ссылки")

	utils.Println(utils.ColorBold + "Перемещение и переименование (mv):" + utils.ColorReset)
	utils.Command("mv old.txt new.txt", "переименовать файл")
	utils.Command("mv file.txt /tmp/", "переместить в /tmp")
	utils.Command("mv -v src dst", "подробный вывод")
	utils.Command("mv -i src dst", "спросить при перезаписи")
	utils.Command("mv -n src dst", "не перезаписывать существующий")
	fmt.Println()
	utils.Println(utils.ColorBold + "Удаление (rm):" + utils.ColorReset)
	utils.Command("rm file.txt", "удалить файл")
	utils.Command("rm -r dir/", "удалить директорию рекурсивно")
	utils.Command("rm -rf dir/", "принудительно, без подтверждений")
	utils.Command("rm -i file.txt", "спросить перед удалением")
	utils.Command("rm -v file.txt", "показать что удаляется")
	fmt.Println()
	utils.Note("rm -rf удаляет безвозвратно. Нет корзины. Будьте внимательны!")
	utils.Code(`# Защита: никогда не делайте:
rm -rf /          # удалит всю систему
rm -rf ./         # удалит текущую директорию

# Безопаснее: перенести в /tmp, потом удалить
mv dangerous_dir /tmp/ && rm -rf /tmp/dangerous_dir`)

	utils.Println(utils.ColorBold + "Жёсткие ссылки (hard links):" + utils.ColorReset)
	utils.Code(`Жёсткая ссылка — ещё одно имя для того же inode.

ln file.txt hardlink.txt     # создать жёсткую ссылку

Особенности:
- указывает на те же данные на диске
- не отличить от оригинала командой ls
- удаление одного имени не удаляет данные
  (данные удаляются когда счётчик ссылок = 0)
- нельзя создать на директорию
- нельзя создать на другой раздел/диске`)

	utils.Println(utils.ColorBold + "Символические ссылки (soft links / symlinks):" + utils.ColorReset)
	utils.Code(`Символическая ссылка — файл, содержащий путь к цели.

ln -s /etc/nginx/nginx.conf nginx.conf   # создать симлинк
ln -s /path/to/dir mylink                # симлинк на директорию
ls -la nginx.conf
# lrwxrwxrwx 1 user group 20 Jan nginx.conf -> /etc/nginx/nginx.conf

Особенности:
- показывается как l в ls -la
- может указывать на директории
- может быть "битым" (цель удалена)
- можно создать между разными разделами
- readlink nginx.conf — показать куда указывает`)

	utils.Command("stat file.txt", "показать подробную информацию о файле (inode, ссылки)")
	utils.Command("ls -i file.txt", "показать номер inode")

	// ─── 09. Чтение текстовых файлов ─────────────────────────────
	utils.Section("09. Чтение текстовых файлов")

	utils.Command("cat file.txt", "вывести весь файл")
	utils.Command("cat -n file.txt", "с номерами строк")
	utils.Command("cat -A file.txt", "показать спецсимволы ($ в конце строк)")
	utils.Command("cat f1 f2 > merged", "объединить файлы")
	fmt.Println()
	utils.Command("less file.txt", "постраничный просмотр (рекомендуется для больших файлов)")
	utils.Command("more file.txt", "постраничный просмотр (только вперёд)")
	fmt.Println()
	utils.Code(`Навигация в less:
  Space / PgDn    — следующая страница
  b / PgUp        — предыдущая страница
  g / G           — начало / конец файла
  /паттерн        — поиск вперёд
  ?паттерн        — поиск назад
  n / N           — следующее / предыдущее совпадение
  q               — выход`)

	utils.Command("head file.txt", "первые 10 строк")
	utils.Command("head -n 20 file.txt", "первые 20 строк")
	utils.Command("head -c 100 file.txt", "первые 100 байт")
	utils.Command("tail file.txt", "последние 10 строк")
	utils.Command("tail -n 30 file.txt", "последние 30 строк")
	utils.Command("tail -f /var/log/syslog", "следить за файлом в реальном времени")
	utils.Command("tail -F /var/log/nginx/access.log", "следить, даже если файл пересоздаётся")
	fmt.Println()
	utils.Command("grep 'текст' file.txt", "поиск строк содержащих 'текст'")
	utils.Command("grep -i 'TEXT' file.txt", "без учёта регистра")
	utils.Command("grep -r 'текст' /etc/", "рекурсивный поиск в директории")
	utils.Command("grep -n 'текст' file.txt", "с номерами строк")
	utils.Command("grep -v 'текст' file.txt", "строки НЕ содержащие 'текст'")
	utils.Command("grep -c 'текст' file.txt", "количество совпадений")
	utils.Command("grep -l 'текст' *.conf", "только имена файлов с совпадениями")
	fmt.Println()
	utils.Command("wc file.txt", "количество строк, слов, байт")
	utils.Command("wc -l file.txt", "только строки")
	utils.Command("wc -w file.txt", "только слова")
	utils.Command("sort file.txt", "сортировать строки")
	utils.Command("sort -r file.txt", "в обратном порядке")
	utils.Command("sort -n file.txt", "числовая сортировка")
	utils.Command("sort -u file.txt", "убрать дубли (unique)")
	utils.Command("uniq file.txt", "убрать соседние одинаковые строки")
	utils.Command("cut -d: -f1 /etc/passwd", "вырезать первое поле (разделитель :)")
	utils.Command("cut -d, -f2,4 data.csv", "поля 2 и 4 из CSV")
	utils.Command("tr 'a-z' 'A-Z' < file.txt", "заменить символы (нижний → верхний регистр)")
	utils.Command("diff file1 file2", "сравнить два файла")
	utils.Command("diff -u file1 file2", "unified-формат (как git diff)")

	// ─── 10. Текстовые редакторы ──────────────────────────────────
	utils.Section("10. Текстовые редакторы: nano и vi/vim")

	utils.Println(utils.ColorBold + "nano — простой редактор:" + utils.ColorReset)
	utils.Command("nano file.txt", "открыть файл в nano")
	utils.Code(`Основные сочетания клавиш в nano:
  Ctrl+O     — сохранить (Write Out)
  Ctrl+X     — выйти
  Ctrl+K     — вырезать строку
  Ctrl+U     — вставить
  Ctrl+W     — поиск
  Ctrl+\     — замена
  Ctrl+G     — справка
  Alt+U      — отменить (undo)`)

	utils.Println(utils.ColorBold + "vi / vim — мощный редактор:" + utils.ColorReset)
	utils.Command("vi file.txt", "открыть в vi")
	utils.Command("vim file.txt", "открыть в vim (улучшенный vi)")
	fmt.Println()
	utils.Code(`Режимы vim:
  Нормальный (Normal)   — навигация, команды. По умолчанию.
  Вставки (Insert)      — ввод текста. Нажать i.
  Командный (Command)   — команды (:). Нажать :
  Визуальный (Visual)   — выделение. Нажать v.

Переключение:
  i          — режим вставки перед курсором
  a          — режим вставки после курсора
  o          — новая строка ниже, режим вставки
  O          — новая строка выше, режим вставки
  Esc        — вернуться в нормальный режим`)

	utils.Code(`Навигация (нормальный режим):
  h j k l    — ← ↓ ↑ →
  w / b      — следующее / предыдущее слово
  0 / $      — начало / конец строки
  gg / G     — начало / конец файла
  :n         — перейти на строку n
  Ctrl+F/B   — вперёд / назад на страницу

Редактирование:
  dd         — удалить строку
  yy         — скопировать строку (yank)
  p          — вставить после курсора
  P          — вставить перед курсором
  u          — отменить (undo)
  Ctrl+R     — повторить (redo)
  /текст     — поиск вперёд
  n / N      — следующее / предыдущее совпадение
  :%s/old/new/g — заменить все вхождения

Сохранение и выход:
  :w         — сохранить
  :q         — выйти
  :wq или ZZ — сохранить и выйти
  :q!        — выйти без сохранения
  :wq!       — принудительно сохранить и выйти`)

	utils.Note("Если застряли в vi — нажмите Esc несколько раз, затем :q! для выхода без сохранения.")
	utils.Note("vimtutor — встроенный интерактивный учебник по vim (30 мин). Запустите в терминале.")

	utils.Footer()
}
