"""Check Electron Cash recovery logic using unfunded, memory-only test wallets.

Run in an isolated environment with Electron Cash's dependencies installed:
python verify-wallet-recovery.py PATH_TO_ELECTRON_CASH OUTPUT_JSON
This is a library check, not a desktop/mobile interface or payment test.
"""

import json
import platform
from pathlib import Path
import subprocess
import sys

source = Path(sys.argv[1]).resolve()
revision = subprocess.check_output(
    ["git", "-C", str(source), "rev-parse", "HEAD"], text=True
).strip()
assert revision == "9d500949b38dd181a986382eb0c2f6061b829fec"
sys.path.insert(0, str(source))

from electroncash.version import PACKAGE_VERSION
from electroncash.wallet import create_new_wallet, restore_wallet_from_text

assert PACKAGE_VERSION == "4.4.6"
created = create_new_wallet(path=None, config=None, seed_type="bip39")
restored = restore_wallet_from_text(created["seed"], path=None, config=None)
different = restore_wallet_from_text(
    created["seed"], path=None, config=None, passphrase="disposable-example-only"
)

original_wallet = created["wallet"]
restored_wallet = restored["wallet"]
assert len(original_wallet.get_receiving_addresses()[:5]) == 5
assert len(original_wallet.get_change_addresses()[:5]) == 5
receive_match = (
    original_wallet.get_receiving_addresses()[:5]
    == restored_wallet.get_receiving_addresses()[:5]
)
change_match = (
    original_wallet.get_change_addresses()[:5]
    == restored_wallet.get_change_addresses()[:5]
)
signing_keys_match = (
    original_wallet.keystore.get_master_private_key(None)
    == restored_wallet.keystore.get_master_private_key(None)
)
passphrase_changes_wallet = (
    original_wallet.get_receiving_addresses()[0]
    != different["wallet"].get_receiving_addresses()[0]
)
assert receive_match and change_match and signing_keys_match
assert not restored_wallet.is_watching_only()
assert passphrase_changes_wallet

result = {
    "software": f"Electron Cash {PACKAGE_VERSION}",
    "sourceCommit": revision,
    "platform": platform.system(),
    "python": platform.python_version(),
    "method": "Official Python library; BIP39 creation and restore; memory-only wallets; no network synchronization, signing, broadcast, or funds; no recovery secrets or addresses recorded.",
    "checks": {
        "firstFiveReceivingAddressesMatch": receive_match,
        "firstFiveChangeAddressesMatch": change_match,
        "signingKeysMatch": signing_keys_match,
        "restoredWalletCanSign": not restored_wallet.is_watching_only(),
        "differentPassphraseChangesWallet": passphrase_changes_wallet,
    },
    "limits": "Does not verify graphical setup screens, backups on physical media, device security, wallet interoperability, or transaction delivery.",
}
serialized = json.dumps(result, indent=2) + "\n"
Path(sys.argv[2]).write_text(serialized, encoding="utf-8")
print(serialized)
