package linuxmodules

import (
	"fmt"
	"rubric/utils"
)

var BashModule = Module{
	Key:         "bash",
	Aliases:     []string{"sh", "shell", "баш"},
	Title:       "Bash: основы и переменные",
	Description: "Темы 12–13: bash-completion, alias, type, переменные окружения",
	Run:         showBash,
}

func showBash() {
	utils.Header("Linux — Bash: основы и переменные")

	// ─── 12. Bash #1 ──────────────────────────────────────────────
	utils.Section("12. Bash #1: bash-completion, alias, type")

	utils.Println(utils.ColorBold + "bash-completion — автодополнение Tab:" + utils.ColorReset)
	utils.Code(`Tab         — дополнить команду / путь / аргумент
Tab Tab     — показать все варианты

# Примеры:
git che<Tab>   → git checkout
ls /etc/sy<Tab> → ls /etc/systemd/
ssh us<Tab>    → ssh user@hostname  (из ~/.ssh/config)
systemctl st<Tab>  → systemctl start/status/stop

# Установить расширенный bash-completion:
# Debian/Ubuntu:  apt install bash-completion
# RHEL/Fedora:    dnf install bash-completion
# Активировать в ~/.bashrc:
[ -f /etc/bash_completion ] && . /etc/bash_completion`)

	utils.Println(utils.ColorBold + "alias — псевдонимы команд:" + utils.ColorReset)
	utils.Code(`# Посмотреть все алиасы:
alias

# Создать алиас (действует до конца сессии):
alias ll='ls -la'
alias la='ls -la'
alias ..='cd ..'
alias ...='cd ../..'
alias grep='grep --color=auto'
alias rm='rm -i'            # защита от случайного удаления
alias df='df -h'
alias free='free -h'
alias update='sudo apt update && sudo apt upgrade'

# Использование алиаса:
ll /etc

# Удалить алиас:
unalias ll

# Посмотреть что делает алиас:
alias ll`)

	utils.Println(utils.ColorBold + "Постоянные алиасы — добавить в ~/.bashrc:" + utils.ColorReset)
	utils.Code(`# ~/.bashrc
alias ll='ls -la --color=auto'
alias la='ls -la'
alias l='ls -CF'
alias ..='cd ..'
alias grep='grep --color=auto'
alias h='history'
alias c='clear'

# Применить без перезапуска терминала:
source ~/.bashrc
# или:
. ~/.bashrc`)

	utils.Println(utils.ColorBold + "type — определить тип команды:" + utils.ColorReset)
	utils.Code(`type ls
# ls is aliased to 'ls --color=auto'

type cd
# cd is a shell builtin

type python3
# python3 is /usr/bin/python3

type ll
# ll is aliased to 'ls -la'

type if
# if is a shell keyword

# Опции:
type -a ls      # все варианты (алиас + файл)
type -t ls      # только тип: alias/builtin/file/keyword`)

	utils.Println(utils.ColorBold + "which и whereis:" + utils.ColorReset)
	utils.Command("which python3", "полный путь к исполняемому файлу")
	utils.Command("which -a python", "все версии python в PATH")
	utils.Command("whereis nginx", "бинарник, исходники, man-страница")
	utils.Command("command -v git", "путь или алиас (POSIX-совместимо)")
	fmt.Println()
	utils.Println(utils.ColorBold + "Работа с историей команд:" + utils.ColorReset)
	utils.Command("history", "полная история")
	utils.Command("history 20", "последние 20 команд")
	utils.Command("!42", "выполнить команду №42")
	utils.Command("!!", "повторить последнюю команду")
	utils.Command("!ls", "последняя команда начинающаяся с ls")
	utils.Command("Ctrl+R", "интерактивный поиск по истории")
	utils.Command("history -c", "очистить историю")
	fmt.Println()
	utils.Code(`# Файл истории: ~/.bash_history
# Управление историей через переменные в ~/.bashrc:
HISTSIZE=10000           # размер в памяти
HISTFILESIZE=20000       # размер файла
HISTCONTROL=ignoredups   # не сохранять дубли
HISTCONTROL=ignorespace  # команды с пробелом впереди не сохраняются
# Временные метки в истории:
HISTTIMEFORMAT="%F %T "`)

	// ─── 13. Bash #2: переменные ──────────────────────────────────
	utils.Section("13. Bash #2: переменные")

	utils.Println(utils.ColorBold + "Переменные оболочки:" + utils.ColorReset)
	utils.Code(`# Создать переменную:
name="Alice"           # без пробелов вокруг =
count=42
PATH_BACKUP=$PATH      # использовать значение другой переменной

# Использовать переменную ($ перед именем):
echo $name             # Alice
echo "Привет, $name!"  # Привет, Alice!
echo "Привет, ${name}!" # фигурные скобки — явное обозначение

# Удалить переменную:
unset name`)

	utils.Println(utils.ColorBold + "Переменные окружения (Environment Variables):" + utils.ColorReset)
	utils.Code(`# Переменные оболочки vs переменные окружения:
# - переменная оболочки видна только в текущем shell
# - переменная окружения (export) передаётся дочерним процессам

# Экспортировать:
export name="Alice"
export PATH="$PATH:/opt/myapp/bin"

# Или сразу:
export count=42

# Посмотреть все переменные окружения:
env
printenv
printenv PATH      # конкретная переменная
echo $PATH         # то же`)

	utils.Println(utils.ColorBold + "Важные системные переменные:" + utils.ColorReset)
	utils.Code(`PATH      — список директорий для поиска команд (: разделитель)
           /usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin
HOME      — домашняя директория (~)        /home/alice
USER      — имя пользователя               alice
LOGNAME   — логин пользователя             alice
SHELL     — оболочка пользователя          /bin/bash
TERM      — тип терминала                  xterm-256color
LANG      — язык/локаль                    en_US.UTF-8
LC_ALL    — переопределить все локали
PWD       — текущая директория             /home/alice/docs
OLDPWD    — предыдущая директория
PS1       — приглашение командной строки
PS2       — вторичное приглашение (>)
EDITOR    — редактор по умолчанию          vim
VISUAL    — визуальный редактор            vim
PAGER     — пагинатор                      less
HISTSIZE  — размер истории в памяти
RANDOM    — случайное число 0-32767`)

	utils.Println(utils.ColorBold + "Специальные переменные bash:" + utils.ColorReset)
	utils.Code(`$0      — имя скрипта / оболочки
$1..$9  — позиционные параметры (аргументы скрипта)
$@      — все аргументы как отдельные строки
$*      — все аргументы как одна строка
$#      — количество аргументов
$?      — код возврата последней команды (0 = успех)
$$      — PID текущего процесса
$!      — PID последнего фонового процесса
$_      — последний аргумент предыдущей команды`)

	utils.Code(`# Примеры:
echo $?          # 0 если последняя команда успешна
ls /nonexistent
echo $?          # 2 (или другой ненулевой) — ошибка

echo $$          # PID bash
echo $RANDOM     # случайное число`)

	utils.Println(utils.ColorBold + "Работа со строками переменных:" + utils.ColorReset)
	utils.Code(`name="alice"

${name}           → alice
${name^}          → Alice   (первая буква заглавная)
${name^^}         → ALICE   (все заглавные)
${name,,}         → alice   (все строчные)

str="hello world"
${#str}           → 11      (длина строки)
${str:0:5}        → hello   (подстрока с 0, длиной 5)
${str:6}          → world   (с позиции 6 до конца)

path="/home/user/file.txt"
${path##*/}       → file.txt      (удалить до последнего /)
${path%/*}        → /home/user    (удалить от последнего /)
${path%.*}        → /home/user/file   (удалить расширение)
${path##*.}       → txt            (только расширение)

# Значения по умолчанию:
${var:-default}   → default если var не задана или пустая
${var:=default}   → присвоить и вернуть default если пустая
${var:?ошибка}    → вывести ошибку если пустая`)

	utils.Println(utils.ColorBold + "Настройка ~/.bashrc и ~/.bash_profile:" + utils.ColorReset)
	utils.Code(`~/.bashrc        — выполняется при каждом запуске интерактивного bash
~/.bash_profile  — выполняется при входе в систему (login shell)
~/.profile       — POSIX-совместимый аналог .bash_profile
~/.bash_logout   — выполняется при выходе

# Типичный ~/.bashrc:
export PATH="$HOME/.local/bin:$PATH"
export EDITOR=vim
alias ll='ls -la'
alias ..='cd ..'

# ~/.bash_profile обычно вызывает ~/.bashrc:
[[ -f ~/.bashrc ]] && . ~/.bashrc

# Применить изменения без перезапуска:
source ~/.bashrc`)

	utils.Footer()
}
