#!/usr/bin/env python3

from os import environ
ipc_path =  "{}/node/geth.ipc".format(environ.get('BFANETWORKDIR', "~/bfa/network"))
rpc_port = 8545
rpc_host = "localhost"
import requests
from web3 import Web3, IPCProvider
from web3.middleware import geth_poa_middleware
import argparse


def getSigners():
    session = requests.Session()
    payload = {"jsonrpc":"2.0", "method":'clique_getSigners',"params":[],"id":1}
    headers = {'Content-type':'application/json'} 
    response = session.post(
        "http://{}:{}".format(rpc_host,rpc_port),
        json=payload,
        headers=headers)
    return response.json()['result']

def lastSeen(n = 720, use_block_number = False):
    last = w3.eth.blockNumber
    signers = set(map(lambda x: x[2:21],getSigners()))
    for i in range(n):
        if not signers: break
        block = last - i
        address = w3.eth.getBlock(block).proofOfAuthorityData[:19].decode('ascii')
        if address in signers:
            print("{}: {}".format(address, block if use_block_number else i))
            signers.remove(address)
    for address in signers:
        print("{}: -1".format(address))

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description=
        """Muestra la cantidad de bloques transcurridos desde la ultima aparición 
        de cada uno de los selladores de la BFA. Si un sellador no ha aparecido por 
        un cierto tiempo (por default 1 hora) imprime -1.""")
    parser.add_argument("-n", help='Máxima cantidad de bloques a recorrer. Default: 720 (1 hora)',type=int, default=720)
    parser.add_argument("-b", "--blockNumber", help="Muestra el número de bloque en lugar de la cantidad de bloques transcurridos", action="store_true")
    parser.add_argument("--ipc-path", help ="Path del archivo geth.ipc. Default: {}".format(ipc_path))
    parser.add_argument("--rpc-port", help ="Puerto RPC. Default: {}".format(rpc_port),type=int)
    args = parser.parse_args()
    if args.ipc_path:
        ipc_path = args.ipc_path
    if args.rpc_port:
        rpc_port = args.rpc_port
    w3 = Web3(Web3.IPCProvider(ipc_path))
    w3.middleware_stack.inject(geth_poa_middleware, layer=0)
    lastSeen(args.n, args.blockNumber)