#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""按 manifest 还原被空间管理归档的文件。

用法：
  python3 space_restore.py --list                 # 列出已归档条目
  python3 space_restore.py --path 关键片段         # 还原匹配的文件
  python3 space_restore.py --all                  # 全部还原
"""
import argparse
import gzip
import json
import os
import shutil

W = '/Users/liuxinyuan/Desktop/Hermes输出-工作类'
ARCH_ROOT = os.path.join(W, '归档', '_空间管理')
MANIFEST = os.path.join(ARCH_ROOT, '_manifest.json')


def main():
    ap = argparse.ArgumentParser()
    ap.add_argument('--list', action='store_true')
    ap.add_argument('--path', default='')
    ap.add_argument('--all', action='store_true')
    a = ap.parse_args()
    man = json.load(open(MANIFEST, encoding='utf-8'))
    items = man.get('items') or []
    if a.list or (not a.path and not a.all):
        print('已归档 %d 个（清单更新于 %s）' % (len(items), man.get('updated')))
        for it in items:
            print('  %s  ← %s（%s，%.1fKB）' % (it['orig'], it['archived_at'], it['mtime'], it['bytes'] / 1024))
        return
    todo = items if a.all else [x for x in items if a.path in x['orig']]
    if not todo:
        print('无匹配条目')
        return
    done = 0
    for it in todo:
        src = os.path.join(W, it['archive'])
        dst = os.path.join(W, it['orig'])
        if not os.path.exists(src):
            print('!! 归档缺失', src)
            continue
        os.makedirs(os.path.dirname(dst) or '.', exist_ok=True)
        with gzip.open(src, 'rb') as fi, open(dst, 'wb') as fo:
            shutil.copyfileobj(fi, fo)
        print('✅ 还原', it['orig'])
        done += 1
    man['items'] = [x for x in items if x not in todo]
    man['updated'] = man.get('updated', '') + '（还原 %d 个）' % done
    json.dump(man, open(MANIFEST, 'w', encoding='utf-8'), ensure_ascii=False, indent=1)
    print('共还原 %d 个' % done)


if __name__ == '__main__':
    main()
