#!/usr/bin/env python3
"""
p2_unzip.py — Распаковка ZIP-потоков из извлечённых стримов
"""

import io
import os
import zipfile

STREAMS_DIR = "hbk_streams"
OUTPUT_DIR = "hbk_content"

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

for name in zip_streams:
    path = os.path.join(STREAMS_DIR, name)
    if not os.path.exists(path):
        print(f"  {name} — не найден, пропуск")
        continue

    out_dir = os.path.join(OUTPUT_DIR, name)
    os.makedirs(out_dir, exist_ok=True)

    try:
        with zipfile.ZipFile(path, "r") as zf:
            entries = zf.namelist()
            print(f"\n{'=' * 60}")
            print(f"  {name}: {len(entries)} файлов")

            # Показать первые 20
            for e in entries[:20]:
                info = zf.getinfo(e)
                print(f"    {e}  ({info.file_size:,} байт)")
            if len(entries) > 20:
                print(f"    ... и ещё {len(entries) - 20}")

            # Извлечь всё
            zf.extractall(out_dir)
            print(f"  Извлечено в: {out_dir}/")

    except zipfile.BadZipFile as e:
        print(f"  {name}: не ZIP или повреждён — {e}")
    except Exception as e:
        print(f"  {name}: ошибка — {e}")

# Также копируем текстовые потоки
for name in ["Book", "MainData", "IndexMainData", "PackLookup"]:
    src = os.path.join(STREAMS_DIR, name)
    if os.path.exists(src):
        dst_dir = os.path.join(OUTPUT_DIR, "_metadata")
        os.makedirs(dst_dir, exist_ok=True)
        with open(src, "rb") as f:
            data = f.read()
        with open(os.path.join(dst_dir, name), "wb") as f:
            f.write(data)

        # Показать содержимое если текстовый
        try:
            text = data.decode("utf-8-sig")
            print(f"\n{'=' * 60}")
            print(f"  {name}:")
            for line in text.splitlines()[:10]:
                print(f"    {line}")
        except:
            pass

print(f"\n{'=' * 60}")
print("Готово! Теперь можно редактировать файлы в hbk_content/FileStorage/")
