#!/usr/bin/env python3

"""
This script generates a simple graph of unmeasured/measured relays for each directory authority that votes on bandwidth

See archives of votes here:
    https://collector.torproject.org/recent/relay-descriptors/votes/ (gzip transfer)
    https://collector.torproject.org/archive/relay-descriptors/votes/ (xz), monthly

Note that DescriptorReader depends on 'tarfile', which in python2.7.9 (jessie) does not support xz (lzma)
archives, though python3.4.2 (jessie) does - tarfile isn't packaged separately in pip or debian.
"""

#import json
from stem.descriptor.reader import DescriptorReader
from stem.descriptor.remote import DescriptorDownloader, DirectoryAuthority, get_authorities
from stem.descriptor.networkstatus import NetworkStatusDocumentV3
from stem.descriptor import DocumentHandler


#json_response = {}
#unmeasured = {}
#json_response['recent_unmeasured'] = unmeasured

# Fetch Remote Descriptors for the most recent consensus
#for dirauth in filter(lambda d: d.is_bandwidth_authority, get_authorities().values()):
#    unmeasured[dirauth.nickname] = {'unmeasured': 0, 'measured': 0}
#    num_unmeasured, num_measured = 0, 0
#    for desc in downloader.get_vote(dirauth).run():
#        if desc.measured == None: # See ticket #16471 on trac.torproject.org
#            num_unmeasured += 1
#        else:
#            num_measured += 1
#    unmeasured[dirauth.nickname] = {'measured': num_measured, 'unmeasured': num_unmeasured}
#    print json.dumps(json_response)

# Load Cached Descriptors from Disk
archives = ['./collector.torproject.org/archive/relay-descriptors/votes/']
reader = DescriptorReader(archives, document_handler=DocumentHandler.DOCUMENT)

reader.start()
for vote in reader:
    # how do we know it is a bwauth?
    # is_bandwidth_authority is not present. :(
    dirauth = vote.directory_authorities[0]
    num_unmeasured, num_measured = 0,0
    for fp, router in vote.routers.items():
        if router.measured == None:
            num_unmeasured += 1
        else:
            num_measured += 1

    #data[dirauth.nickname][dirauth.published]['unmeasured_stat'] = (num_measured, num_unmeasured)
    print("{},{},{},{}".format(vote.published, dirauth.nickname, num_measured, num_unmeasured))
