#!/usr/bin/env python3
"""
e6_minify_html.py — Минимизатор HTML: убирает отступы, переносы, лишние пробелы.
Превращает HTML в одну строку.

Использование:
    python e6_minify_html.py input.html              → выводит в stdout
    python e6_minify_html.py input.html output.html  → сохраняет в файл
    python e6_minify_html.py --dir ./folder           → все .html в папке (на месте)
"""

import os
import re
import sys


def minify_html(html):
    # Защищаем содержимое <pre>, <textarea>, <script>, <style>
    preserved = []

    def save_block(m):
        preserved.append(m.group(0))
        return f"\x00BLOCK{len(preserved) - 1}\x00"

    html = re.sub(
        r"(<(?:pre|textarea|script|style)\b[^>]*>)(.*?)(</(?:pre|textarea|script|style)>)",
        save_block,
        html,
        flags=re.DOTALL | re.IGNORECASE,
    )

    # Убираем HTML-комментарии
    html = re.sub(r"<!--.*?-->", "", html, flags=re.DOTALL)

    # Убираем переносы строк и табы → один пробел
    html = re.sub(r"[\r\n\t]+", " ", html)

    # Множественные пробелы → один
    html = re.sub(r" {2,}", " ", html)

    # Пробелы вокруг тегов
    html = re.sub(r">\s+<", "><", html)
    html = re.sub(r">\s+", ">", html)
    html = re.sub(r"\s+<", "<", html)

    # Восстанавливаем защищённые блоки
    for i, block in enumerate(preserved):
        html = html.replace(f"\x00BLOCK{i}\x00", block)

    return html.strip()


if __name__ == "__main__":
    if len(sys.argv) < 2:
        print("Использование:")
        print("  python html_minify.py input.html [output.html]")
        print("  python html_minify.py --dir ./folder")
        sys.exit(1)

    if sys.argv[1] == "--dir":
        folder = sys.argv[2] if len(sys.argv) > 2 else "."
        count = 0
        for root, _, files in os.walk(folder):
            for fname in files:
                if not fname.lower().endswith(".html"):
                    continue
                fpath = os.path.join(root, fname)
                with open(fpath, "r", encoding="utf-8-sig") as f:
                    original = f.read()
                result = minify_html(original)
                if len(result) < len(original):
                    with open(fpath, "w", encoding="utf-8-sig") as f:
                        f.write(result)
                    saved = len(original) - len(result)
                    count += 1
                    print(f"  {os.path.relpath(fpath, folder)}  -{saved} байт")
        print(f"\nМинимизировано: {count} файлов")
    else:
        input_file = sys.argv[1]
        with open(input_file, "r", encoding="utf-8-sig") as f:
            html = f.read()

        result = minify_html(html)

        if len(sys.argv) > 2:
            with open(sys.argv[2], "w", encoding="utf-8-sig") as f:
                f.write(result)
            print(f"{len(html)} → {len(result)} байт")
        else:
            print(result)
