#!/usr/bin/env python3.6
import os, dropbox, requests
import xml.etree.ElementTree as ET
from dropbox.files import WriteMode

from colour import Color

def get_xml_test_results():
   tree = ET.parse('result.xml')
   root = tree.getroot()
   failures = int(root.attrib['failures'])
   total = int(root.attrib['tests'])
   return [failures, total]

def buildURL(subject, value, color):
   return 'https://img.shields.io/badge/{}-{}-{}.svg'.format(subject, value, color)

def getPicture(path):
   with open(path, "rb") as imageFile:
      return imageFile.read()

def downloadImage(image_url):
   session = requests.Session()
   session.headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.109 Safari/537.36"}
   localFilename = image_url.split('/')[-1].split("?")[0].split('-')[0].lower() + '.svg'

   r = session.get(image_url, stream=True, verify=False)
   with open(localFilename, 'wb') as f:
      for chunk in r.iter_content(chunk_size=1024):
         f.write(chunk)

   return localFilename

def getColor(value):
   start = Color('red')
   end = Color('yellowgreen')
   colors = list(start.range_to(Color(end), 10))
   hexList = []
   for color in colors:
      if not str(color)[:1] is '#':
         hexList.append(color.hex[1:])
      else:
         hexList.append(str(color)[1:])

      if (len(hexList[-1]) <= 4):
         hexList[-1] = hexList[-1] + '000'
   
   return hexList[int(float(value)/10)]

def uploadToDropbox(path):
   dbx = dropbox.Dropbox(os.environ.get('DROPBOX_ACCESS_TOKEN'))
   response = dbx.files_upload(getPicture(path), '/knowit-18/' + path, mode=WriteMode('overwrite', None))

def main():
   failures, total = get_xml_test_results()
   progress = "{0:.1f}".format((total-failures)/total * 100)
   completed = str(total-failures) + '_of_' + str(total)
   color = getColor(progress)

   image1 = downloadImage(buildURL('Progress', progress + '%25', color))
   image2 = downloadImage(buildURL('Completed', completed, color))

   uploadToDropbox(image1)
   uploadToDropbox(image2)

if __name__ == '__main__':
   main()
