#!/usr/bin/env python3.12
"""Import folder publik MEGA (anonim) lalu list / download isinya.
Usage:
  python3.12 mega_folder2.py list
  python3.12 mega_folder2.py download /tujuan/dir
"""
import os, sys, json

HANDLE = "HRMAlYzK"
KEY = "IJeN5r2FcnfkWLt7w4ZfzQ"
FOLDER_NAME = "TSC-STOCK-BARU"

from mega import Mega
from mega.crypto import (base64_to_a32, a32_to_base64, encrypt_key,
                         base64_url_encode, encrypt_attr)

DEST_DEFAULT = "/home/mantapman/.hermes/profiles/atun/workspace/tsc_stock_baru"


def connect():
    m = Mega().login()
    key = base64_to_a32(KEY)
    # Link folder MEGA = 128-bit (4 int a32), tanpa pasangan nonce → dipakai langsung
    k = key[:4] if len(key) >= 4 else key
    if len(key) >= 8:
        k = (key[0] ^ key[4], key[1] ^ key[5], key[2] ^ key[6], key[3] ^ key[7])
    enc_key = a32_to_base64(encrypt_key(k, m.master_key))
    enc_name = base64_url_encode(encrypt_attr({'n': FOLDER_NAME}, k))
    dest = m.get_node_by_type(2)[1]
    res = m._api_request({'a': 'p', 't': dest['h'],
                          'n': [{'ph': HANDLE, 't': 1, 'a': enc_name, 'k': enc_key}]})
    print("import hasil:", res, flush=True)
    m._trash_folder_node_id = m.get_node_by_type(4)[0]
    return m


def main():
    mode = sys.argv[1] if len(sys.argv) > 1 else "list"
    dest_dir = sys.argv[2] if len(sys.argv) > 2 else DEST_DEFAULT
    m = connect()
    files = m.get_files()
    items = []
    for h, v in files.items():
        if v.get('t') in (2, 3, 4):
            continue
        items.append((h, v))
    print(f"\n{len(items)} node isi folder:")
    for h, v in items:
        print(f"  {h} | {'DIR ' if v.get('t') == 1 else 'FILE'} | {v.get('s')} B | {v.get('a', {}).get('n')}")
    json.dump({h: {'name': v.get('a', {}).get('n'), 't': v.get('t'), 's': v.get('s')} for h, v in items},
              open("/home/mantapman/.hermes/profiles/atun/workspace/mega_folder_list.json", "w"),
              indent=1, ensure_ascii=False)

    if mode == "download":
        os.makedirs(dest_dir, exist_ok=True)
        for h, v in items:
            if v.get('t') != 0:
                continue
            name = v.get('a', {}).get('n')
            if os.path.exists(os.path.join(dest_dir, name)):
                print("skip (sudah ada):", name, flush=True)
                continue
            print("unduh:", name, flush=True)
            try:
                m.download((h, v), dest_path=dest_dir)
            except Exception as e:
                print("  GAGAL:", type(e).__name__, e, flush=True)
        print("\nisi dir:", sorted(os.listdir(dest_dir)))


if __name__ == "__main__":
    main()
