# -*- coding: utf-8 -*-
"""Generate TTRPG-Release-Instructions.docx (run: python scripts/generate-release-docx.py)."""
from __future__ import annotations

from pathlib import Path

from docx import Document
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.shared import Pt

ROOT = Path(__file__).resolve().parents[1]
OUT_PATHS = [
    ROOT / "docs" / "TTRPG-Release-Instructions.docx",
    Path(r"D:\TTRPG-Release\TTRPG-Release-Instructions.docx"),
]


def add_bullet(doc: Document, text: str, level: int = 0) -> None:
    style = "List Bullet" if level == 0 else "List Bullet 2"
    doc.add_paragraph(text, style=style)


def add_step(doc: Document, title: str, body: str) -> None:
    p = doc.add_paragraph()
    p.add_run(f"{title}. ").bold = True
    p.add_run(body)


def build_document() -> Document:
    doc = Document()
    normal = doc.styles["Normal"]
    normal.font.name = "Calibri"
    normal.font.size = Pt(11)

    title = doc.add_heading("TTRPG Player — сборка и публикация обновлений", level=0)
    title.alignment = WD_ALIGN_PARAGRAPH.CENTER

    doc.add_paragraph(
        "Одна версия на все платформы. Сначала вручную поднимается версия и собирается macOS; "
        "затем на Windows скрипт собирает Win/Linux без повторного bump и выкладывает на "
        "https://updates.ttrpgplayer.ru/"
    )

    doc.add_heading("Рекомендуемый порядок", level=1)

    add_step(
        doc,
        "Шаг 1. Поднять версию",
        "В каталоге проекта dnd_player: bump-version.cmd (D:\\TTRPG-Release) "
        "или npm version patch --no-git-tag-version. "
        "Закоммитить package.json при необходимости до сборки на Mac.",
    )
    add_step(
        doc,
        "Шаг 2. Собрать macOS (только на Mac)",
        "FFMPEG_BINARIES_URL=https://cdn.npmmirror.com/binaries/ffmpeg-static npm ci && "
        "npm run build && npm run pack:mac",
    )
    add_step(
        doc,
        "Шаг 3. Скопировать Mac-артефакты в D:\\TTRPG-Release",
        "latest-mac.yml (только свежий с Mac), TTRPGPlayer-x64.zip, TTRPGPlayer-arm64.zip; "
        "опционально TTRPGPlayer-x64.dmg, TTRPGPlayer-arm64.dmg. "
        "Версия в latest-mac.yml должна совпадать с package.json.",
    )
    add_step(
        doc,
        "Шаг 4. Сборка Win/Linux и публикация (Windows)",
        "release-all.cmd — по умолчанию режим -AfterMac: без bump, проверка Mac-файлов, "
        "сборка Windows и Linux (WSL), копирование в D:\\TTRPG-Release, upload на сервер.",
    )

    doc.add_heading("Скрипты (D:\\TTRPG-Release)", level=1)
    table = doc.add_table(rows=7, cols=2)
    table.style = "Table Grid"
    table.rows[0].cells[0].text = "Команда"
    table.rows[0].cells[1].text = "Назначение"
    rows = [
        ("bump-version.cmd", "Только patch в package.json (шаг 1)"),
        ("release-all.cmd", "Шаг 4: Win/Linux + publish, без bump (-AfterMac)"),
        ("prepare-release.cmd -AfterMac", "Только сборка Win/Linux и копирование"),
        ("publish.cmd", "Только проверка и upload на VPS"),
        ("publish.cmd -SkipMac", "Выложить Win/Linux, если Mac ещё не готов"),
        ("release-all-bump.cmd", "Устаревший режим: bump в скрипте, Mac потом"),
    ]
    for i, (cmd, desc) in enumerate(rows, start=1):
        table.rows[i].cells[0].text = cmd
        table.rows[i].cells[1].text = desc

    doc.add_heading("Флаги prepare-release", level=2)
    for line in [
        "-AfterMac — не менять версию; требовать Mac-файлы в папке релиза (по умолчанию в release-all)",
        "-Bump — поднять patch и собрать (старый порядок)",
        "-SkipGit, -SkipLinux, -NoBump, -Version X.Y.Z, -Minor",
    ]:
        add_bullet(doc, line)

    doc.add_heading("Флаги publish", level=2)
    add_bullet(doc, "-CheckOnly — проверить файлы, без upload")
    add_bullet(doc, "-SkipMac — не проверять и не заливать macOS")

    doc.add_heading("Артефакты (имена без версии)", level=1)
    art = doc.add_table(rows=4, cols=2)
    art.style = "Table Grid"
    art.rows[0].cells[0].text = "Платформа"
    art.rows[0].cells[1].text = "Файлы"
    artifacts = [
        (
            "Windows",
            "latest.yml, TTRPGPlayer-Setup.exe, TTRPGPlayer-Setup.exe.blockmap",
        ),
        (
            "Linux",
            "latest-linux.yml, latest-linux-arm64.yml, "
            "TTRPGPlayer-x64.AppImage, TTRPGPlayer-arm64.AppImage",
        ),
        (
            "macOS",
            "latest-mac.yml, TTRPGPlayer-x64.zip, TTRPGPlayer-arm64.zip "
            "(zip — автообновление; dmg — опционально, вручную)",
        ),
    ]
    for i, (plat, files) in enumerate(artifacts, start=1):
        art.rows[i].cells[0].text = plat
        art.rows[i].cells[1].text = files

    doc.add_heading("Требования", level=1)
    for line in [
        "Windows: Node.js 20.19+ (или 22.12+), git, OpenSSH, WSL2 с nvm (Node 22, .nvmrc в проекте)",
        "Проект: D:\\Work\\my_projects\\dnd_project\\dnd_player",
        "Папка релиза: D:\\TTRPG-Release",
        "SSH: %USERPROFILE%\\.ssh\\ttrpg_updates_root → root@185.173.94.234",
        "Mac: Node 20+, сборка только на macOS",
    ]:
        add_bullet(doc, line)

    doc.add_heading("Проверка после выкладки", level=1)
    for url in [
        "https://updates.ttrpgplayer.ru/latest.yml",
        "https://updates.ttrpgplayer.ru/latest-linux.yml",
        "https://updates.ttrpgplayer.ru/latest-mac.yml",
    ]:
        add_bullet(doc, url)

    doc.add_heading("Частые проблемы", level=1)
    problems = [
        (
            "Win/Linux на версию выше Mac",
            "Не использовать release-all-bump.cmd. Сначала bump + Mac, потом release-all.cmd.",
        ),
        (
            "macOS: missing TTRPGPlayer-1.0.xx-mac.zip",
            "Устаревший latest-mac.yml — пересобрать на Mac или publish.cmd -SkipMac.",
        ),
        (
            "git push Failed to authenticate",
            "Скрипт повторит push с токеном Gitea; или настроить credentials для git.mailib.ru.",
        ),
        (
            "WSL Linux build / Node 18",
            "Нужен nvm и Node 22 (scripts/wsl-pack-linux.sh).",
        ),
        (
            "npm ci / ffmpeg-static / GitHub 5xx",
            "Win-скрипт повторит npm ci через FFMPEG_BINARIES_URL; на Mac используйте эту переменную вручную.",
        ),
        (
            "AfterMac: version mismatch",
            "Версии в package.json и latest-mac.yml должны совпадать до запуска release-all.",
        ),
    ]
    for prob, fix in problems:
        p = doc.add_paragraph()
        p.add_run(f"{prob}. ").bold = True
        p.add_run(fix)

    p = doc.add_paragraph()
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    p.add_run("Конфиг: release-config.json, publish-config.json в D:\\TTRPG-Release").italic = True

    return doc


def main() -> None:
    doc = build_document()
    for path in OUT_PATHS:
        path.parent.mkdir(parents=True, exist_ok=True)
        doc.save(str(path))
        print(f"Wrote {path}")


if __name__ == "__main__":
    main()
