#!/usr/bin/env python3

import os
import qrcode
import base64
from mnemonic import Mnemonic
from bitcoinlib.keys import HDKey
from pykeepass import PyKeePass, create_database
from getpass import getpass
import gc

# Generate a BIP-0039 mnemonic seed phrase
mnemonic = Mnemonic("english")
seed_phrase = mnemonic.generate(strength=128)

# Derive the HDKey from the seed phrase
hd_key = HDKey.from_passphrase(seed_phrase)

# Derive the Bitcoin address from the HDKey
child_key = hd_key.subkey_for_path("m/0/0")
address = child_key.address()

# Create a QR code instance
qr = qrcode.QRCode(
    version=1,
    error_correction=qrcode.constants.ERROR_CORRECT_H,
    box_size=10,
    border=4,
)

# Add the data to the QR code
qr.add_data(seed_phrase)

# Generate the QR code image
qr.make(fit=True)
qr_image = qr.make_image(fill_color="black", back_color="white")

# Convert the QR code image to base64
qr_base64 = base64.b64encode(qr_image.tobytes()).decode()

# Prompt for custom name for the wallet
wallet_name = input(
    "Whould you like to name this wallet? (empty for using the address as name): "
)

# Prompt the user for the passphrase
passphrase = getpass("Enter passphrase for the KeePassXC database: ")

# Create the database filename with the wallet number
if wallet_name == "":
    wallet_name = address


db_filename = f"{wallet_name}.kdbx"

# Create a KeePassXC database file
db = create_database(db_filename, password=passphrase)

# Create an entry in the root group
entry = db.add_entry(db.root_group, wallet_name, username=address, password=seed_phrase)

# Add the QR code as a note (base64 encoded)
entry.notes = qr_base64

# Save the database
db.save()

del mnemonic
del seed_phrase, address, hd_key, passphrase, qr_image, qr_base64
gc.collect()

print("---")
print("Bitcoin address was successfully created. You can find at: " + db_filename)
print("---")
