import binascii
from zope.interface import implements
from lbrynet.interfaces import IPeerFinder


class DHTPeerFinder(object):
    """This class finds peers which have announced to the DHT that they have certain blobs"""
    implements(IPeerFinder)

    def __init__(self, dht_node, peer_manager):
        self.dht_node = dht_node
        self.peer_manager = peer_manager
        self.peers = []
        self.next_manage_call = None

    def run_manage_loop(self):

        from twisted.internet import reactor

        self._manage_peers()
        self.next_manage_call = reactor.callLater(60, self.run_manage_loop)

    def stop(self):
        if self.next_manage_call is not None and self.next_manage_call.active():
            self.next_manage_call.cancel()
            self.next_manage_call = None

    def _manage_peers(self):
        pass

    def find_peers_for_blob(self, blob_hash):
        bin_hash = binascii.unhexlify(blob_hash)

        def filter_peers(peer_list):
            peers = set(peer_list)
            good_peers = []
            for host, port in peers:
                peer = self.peer_manager.get_peer(host, port)
                if peer.is_available() is True:
                    good_peers.append(peer)
            return good_peers

        d = self.dht_node.getPeersForBlob(bin_hash)
        d.addCallback(filter_peers)
        return d

    def get_most_popular_hashes(self, num_to_return):
        return self.dht_node.get_most_popular_hashes(num_to_return)