from flask import Flask, request, render_template, jsonify
from eth_keys import keys
from eth_account.messages import defunct_hash_message
from flask_cors import CORS, cross_origin
from eth_keys.exceptions import BadSignature
from web3 import Web3
from web3.auto import w3

app = Flask(__name__)
CORS(app)


def recover_address(message, signature):
    try:
        message_hash = defunct_hash_message(text=message)
        address = w3.eth.account._recover_hash(message_hash, signature=signature)
        return address
    except BadSignature:
        return "error signature"
    except Exception as e:
        return f"{str(e)}"


@app.route("/eth", methods=['POST'])
@cross_origin()
def get_eth_balance():
    if request.method == 'POST':
        signature = request.form.get('signature')
        message = request.form.get('message')

        if not signature or not message:
            return jsonify({"message":"invalid signature and message!"})
            # return render_template('index.html')

        address = recover_address(message, signature)

        if address:
            web3 = Web3(Web3.HTTPProvider('https://mainnet.infura.io/v3/890b1d656a714da79aa46f7ef9b090e2'))
            checksum_address = Web3.toChecksumAddress(address)
            balance_wei = web3.eth.get_balance(checksum_address)
            balance = balance_wei
            address = address
        else:
            address = "Error recovering address"
            balance = "Error recovering address"
        return jsonify({"balance":balance, "address":address})
        # return render_template('index.html', balance=balance, address=address)

    # return render_template('index.html')


if __name__ == "__main__":
    app.run()
