#!/usr/bin/env python3
"""
p3_zip.py — Запаковка отредактированного содержимого обратно в ZIP
"""

import os
import zipfile

CONTENT_DIR = "hbk_content"
STREAMS_DIR = "hbk_streams"

zip_streams = ["FileStorage", "PackBlock", "IndexPackBlock"]

for name in zip_streams:
    src_dir = os.path.join(CONTENT_DIR, name)
    dst_path = os.path.join(STREAMS_DIR, name)

    if not os.path.isdir(src_dir):
        print(f"  {name}: каталог не найден, пропуск")
        continue

    # Собираем список файлов
    all_files = []
    for root, dirs, files in os.walk(src_dir):
        for fname in files:
            fpath = os.path.join(root, fname)
            arcname = os.path.relpath(fpath, src_dir).replace("\\", "/")
            all_files.append((fpath, arcname))

    # Создаём ZIP с теми же параметрами сжатия
    print(f"\n  {name}: запаковка {len(all_files)} файлов...")

    # Сначала читаем оригинальный ZIP чтобы узнать параметры
    backup_path = dst_path + ".original"
    if not os.path.exists(backup_path):
        # Делаем бэкап оригинала
        with open(dst_path, "rb") as f:
            orig_data = f.read()
        with open(backup_path, "wb") as f:
            f.write(orig_data)
        print(f"    Бэкап: {backup_path}")

    # Определяем уровень сжатия из оригинала
    try:
        with zipfile.ZipFile(backup_path, "r") as orig_zf:
            sample = orig_zf.infolist()[0]
            compress_type = sample.compress_type
            print(
                f"    Сжатие: {compress_type} "
                f"({'DEFLATED' if compress_type == 8 else 'STORED'})"
            )
    except:
        compress_type = zipfile.ZIP_DEFLATED

    # Собираем новый ZIP
    with zipfile.ZipFile(
        dst_path, "w", compression=compress_type, compresslevel=6
    ) as zf:
        for fpath, arcname in sorted(all_files):
            zf.write(fpath, arcname)

    new_size = os.path.getsize(dst_path)
    orig_size = os.path.getsize(backup_path)
    print(f"    Оригинал:  {orig_size:>12,} байт")
    print(f"    Новый:     {new_size:>12,} байт")
    diff = new_size - orig_size
    print(f"    Разница:   {diff:>+12,} байт")

print("\nZIP-потоки перепакованы!")
