# standard imports
import logging

# third-party imports
import web3

# local imports
from .mined import MinedSyncer
from .base import Syncer

logg = logging.getLogger()


class HeadSyncer(MinedSyncer):
    """Implements the get method in Syncer for retrieving every new mined block.

    :param bc_cache: Retrieves block cache cursors for chain head and latest processed block.
    :type bc_cache: Object implementing methods from cic_eth.sync.SyncerBackend 
    """
    def __init__(self, bc_cache):
        super(HeadSyncer, self).__init__(bc_cache)
        # TODO: filter not returning all blocks, at least with ganache. kind of defeats the point, then
        #self.w3_filter = rpc.w3.eth.filter({
        #    'fromBlock': block_offset,
        #    }) #'latest')
        #self.bc_cache.set(block_offset, 0)
        logg.debug('initialized head syncer with offset {}'.format(bc_cache.start()))

    """Implements Syncer.get

    :param w3: Web3 object
    :type w3: web3.Web3
    :returns: Block hash of newly mined blocks. if any
    :rtype: list of str, 0x-hex
    """
    def get(self, w3):
        # Of course, the filter doesn't return the same block dict format as getBlock() so we'll just waste some cycles getting the hashes instead.
        #hashes = []
        #for block in self.w3_filter.get_new_entries():
        #    hashes.append(block['blockHash'])
        #logg.debug('blocks {}'.format(hashes))
        #return hashes
        (block_number, tx_number) = self.bc_cache.get()
        block_hash = []
        try:
            block = w3.eth.getBlock(block_number)
            block_hash.append(block.hash)
        except web3.exceptions.BlockNotFound:
            pass

        return block_hash