#!/usr/bin/env python
import sys
import logging

try:
  import argparse
except ImportError as e:
  print e
  print "DEPENDENCY ERROR: could not import argparse"
  print " To remedy, install argparse from PyPI:"
  print "  # pip install argparse"
  raise Exception("ABORTING")

try:
  import bencode
except ImportError as e:
  print e
  print "DEPENDENCY ERROR: could not import bencode"
  print " To remedy, install bencode from PyPI:"
  print "  # pip install bencode"
  raise Exception("ABORTING")

from lbff.LocalBitTorrentFileFinder import LocalBitTorrentFileFinder

__version__ = "0.2.2"
__project__ = "localbff " + __version__

parser = argparse.ArgumentParser(description='Find the local files that are described in a BitTorrent metafile.')
parser.add_argument('-q', '--quick-verification',
  help="verify only the minimum number of pieces needed to verify files",
  dest="quick_verification",
  action="store_true",
  default=False)
parser.add_argument('-v', '--verbosity',
  help="level of console logging (default is WARNING)",
  dest='console_verbosity',
  choices=['DEBUG','INFO','ERROR','WARNING','CRITICAL'],
  default="WARNING")
parser.add_argument('-l', '--log-verbosity',
  help="level of log file verbosity (default is INFO)",
  dest='file_verbosity',
  choices=['DEBUG','INFO','ERROR','WARNING','CRITICAL'],
  default="INFO")
parser.add_argument('metafile', metavar='/path/to/torrentFile.torrent',
  help='a BitTorrent metafile')
parser.add_argument('contentDirectory', metavar='/path/to/contentDirectory',
  help='directory where files might be located')
args = parser.parse_args()

metafilePath = args.metafile.decode('utf-8')
contentDirectory = args.contentDirectory.decode('utf-8')

console_loglevel = args.console_verbosity
console_loglevel_num = getattr(logging, console_loglevel.upper(), None)
file_loglevel = args.file_verbosity
file_loglevel_num = getattr(logging, file_loglevel.upper(), None)

if not isinstance(console_loglevel_num, int):
  raise ValueError('Invalid console log level: %s' % console_loglevel)
if not isinstance(file_loglevel_num, int):
  raise ValueError('Invalid file log level: %s' % file_loglevel)

logging.basicConfig( level=file_loglevel_num,
  format='%(message)s',
  datefmt='%m-%d %H:%M',
  filename='/tmp/localBFF.log',
  filemode='w')

console = logging.StreamHandler()
console.setLevel(console_loglevel_num)
formatter = logging.Formatter('%(message)s')
console.setFormatter(formatter)

cli_logger = logging.getLogger()
cli_logger.addHandler(console)
cli_logger.info(__project__)
cli_logger.info("="*len(__project__))
cli_logger.debug(" $ " + " ".join(sys.argv))
service = LocalBitTorrentFileFinder( metafilePath=metafilePath,
  contentDirectory=contentDirectory,
  fastVerification=args.quick_verification
)

service.processMetafile()

service.gatherAllFilesFromContentDirectory()

service.connectFilesInMetafileToPossibleMatchesInContentDirectory()

service.positivelyMatchFilesInMetafileToPossibleMatches()

for matchedFile in service.files:
  output = ""
  metafilePayloadFilePath = matchedFile.getPathFromMetafile()
  
  if matchedFile.status == 'NOT_CHECKED':
    output = "No file could be found"
  elif matchedFile.status == 'MATCH_FOUND':
    output = matchedFile.getMatchedPathFromContentDirectory()
  elif matchedFile.status == 'CHECKED_WITH_NO_MATCH':
    output = "No matches found"
  elif matchedFile.status == 'UNVERIFIABLE':
    output = "Impossible to verify file"
  
  print "FILE METADATA => " + metafilePayloadFilePath 
  print "              => " + output

print "\nPercentage matched => " + str(service.percentageMatched) + "%\n"
