package devopsmodules

import (
	"rubric/utils"
)

var GitModule = Module{
	Key:         "git",
	Aliases:     []string{"g", "vcs"},
	Title:       "Git — система контроля версий",
	Description: "Основы, ветвление, merge/rebase, удалённые репозитории, рабочие процессы",
	Run:         showGit,
}

func showGit() {
	utils.Header("DevOps — Git")

	utils.Section("Основы и настройка")
	utils.Code(`# Первоначальная настройка:
git config --global user.name  "Alice Smith"
git config --global user.email "alice@example.com"
git config --global core.editor vim
git config --global init.defaultBranch main
git config --global pull.rebase false   # merge при pull
git config --list`)

	utils.Println(utils.ColorBold + "Создание репозитория:" + utils.ColorReset)
	utils.Command("git init", "инициализировать в текущей папке")
	utils.Command("git clone https://github.com/user/repo", "клонировать")
	utils.Command("git clone --depth 1 https://github.com/user/repo", "только последний коммит")
	utils.Command("git clone -b develop https://github.com/user/repo", "конкретная ветка")

	utils.Section("Базовые операции")
	utils.Code(`git status                     # состояние рабочей директории
git status -s                  # краткий формат

# Staging:
git add file.txt               # конкретный файл
git add .                      # все изменения
git add -p                     # интерактивно по кускам

# Коммит:
git commit -m "feat: добавить авторизацию"
git commit -am "fix: исправить баг"    # add + commit
git commit --amend                     # изменить последний коммит

# История:
git log --oneline --graph --all        # граф всех веток
git log --since="2 weeks ago" --author="Alice"
git log -p file.txt                    # история файла с диффом`)

	utils.Println(utils.ColorBold + "Diff и просмотр:" + utils.ColorReset)
	utils.Command("git diff", "изменения не в staging")
	utils.Command("git diff --staged", "изменения в staging")
	utils.Command("git diff main..feature", "между ветками")
	utils.Command("git show abc1234", "конкретный коммит")
	utils.Command("git blame file.txt", "кто написал каждую строку")

	utils.Section("Ветвление")
	utils.Code(`git branch                     # список локальных веток
git branch -a                  # включая удалённые
git switch -c feature/login    # создать и переключиться
git switch main                # переключиться
git branch -d feature/login    # удалить влитую ветку
git branch -D feature/login    # принудительно

# Merge:
git merge --no-ff feature/login   # всегда создавать merge commit
git merge --squash feature/login  # слить все коммиты в один
git merge --abort                 # отменить при конфликте

# Rebase:
git rebase main                # перенести коммиты поверх main
git rebase -i HEAD~3           # интерактивный (squash, reword, drop...)
git rebase --abort / --continue`)

	utils.Note("Не делай rebase публичных веток, которые уже запушены.")

	utils.Section("Удалённые репозитории")
	utils.Command("git remote -v", "список удалённых")
	utils.Command("git remote add origin https://github.com/user/repo", "добавить")
	utils.Command("git fetch --all", "скачать изменения без слияния")
	utils.Command("git pull --rebase", "fetch + rebase")
	utils.Command("git push -u origin feature/login", "отправить и установить upstream")
	utils.Command("git push --force-with-lease", "force push с проверкой (безопаснее --force)")

	utils.Section("Откат изменений")
	utils.Code(`git restore file.txt          # вернуть файл как в HEAD
git restore --staged file.txt # убрать из staging
git revert HEAD               # новый коммит-отмена
git reset HEAD~1              # убрать последний коммит, оставить изменения
git reset --hard HEAD~1       # убрать коммит И изменения (осторожно!)

# Stash — временное сохранение:
git stash push -m "wip: форма логина"
git stash list
git stash pop                  # восстановить последний
git stash branch feature/wip   # создать ветку из stash`)

	utils.Section("Теги и продвинутые команды")
	utils.Code(`git tag -a v1.0.0 -m "Релиз"  # аннотированный тег
git push origin --tags          # отправить все теги

# Cherry-pick — перенести конкретный коммит:
git cherry-pick abc1234

# Bisect — бинарный поиск бага:
git bisect start
git bisect bad                  # текущая версия сломана
git bisect good v1.0.0         # эта работала
# git bisect good / bad до нахождения
git bisect reset`)

	utils.Section("Рабочие процессы (Workflows)")
	utils.Code(`Git Flow:
  main       — продакшн (только теги релизов)
  develop    — интеграционная ветка
  feature/*  — новые функции (от develop)
  release/*  — подготовка релиза
  hotfix/*   — срочные правки (от main)

GitHub Flow (проще):
  main       — всегда рабочий код
  feature/*  — ветка от main → Pull Request → merge

Trunk-Based Development (для CI/CD):
  main       — единая ветка, коммиты несколько раз в день
  Короткоживущие ветки (< 1 дня), feature flags

Conventional Commits:
  feat:     — новая функциональность
  fix:      — исправление бага
  docs:     — документация
  refactor: — рефакторинг
  test:     — тесты
  chore:    — сборка, зависимости`)

	utils.Code(`# .gitignore — игнорируемые файлы:
*.log
node_modules/
.env
__pycache__/
build/
dist/
.DS_Store`)

	utils.Footer()
}
