# script to download the emoticons from GitHub and to produce a table for
# inclusion in Doxygen. Works with python 2.7+ and python 3.x
import json
import os
import argparse
import re
try:
    import urllib.request as urlrequest
except ImportError:
    import urllib as urlrequest

unicode_re = re.compile(r'.*?/unicode/(.*?).png\?.*')

def get_emojis():
    response  = urlrequest.urlopen('https://api.github.com/emojis')
    raw_data  = response.read()
    return json.loads(raw_data)

def download_images(dir_name, silent):
    if not os.path.exists(dir_name):
        os.makedirs(dir_name)
    json_data = get_emojis()
    num_items = len(json_data)
    cur_item=0
    for image,url in sorted(json_data.items()):
        image_name = image+'.png'
        cur_item=cur_item+1
        if url.find('/unicode/')==-1 or not os.path.isfile(dir_name+'/'+image_name):
            success = True
            with open(dir_name+'/'+image_name,'wb') as file:
                if not silent:
                    print('%s/%s: fetching %s' % (cur_item,num_items,image_name))
                try:
                    file.write(urlrequest.urlopen(url).read())
                except:
                    print('Unable to fetch %s' % (image_name))
                    success = False
            if not success:
                os.remove(dir_name+'/'+image_name)
        else:
            if not silent:
                print('%s/%s: skipping %s' % (cur_item,num_items,image_name))

def produce_table():
    json_data = get_emojis()
    lines = []
    for image,url in sorted(json_data.items()):
        match = unicode_re.match(url)
        if match:
            unicodes = match.group(1).split('-')
            unicodes_html = ''.join(["&#x"+x+";" for x in unicodes])
            image_str = "\":"+image+":\","
            unicode_str = "\""+unicodes_html+"\""
            lines.append('  { %-42s %-38s }' % (image_str,unicode_str))
    out_str = ',\n'.join(lines)
    print("{")
    print(out_str)
    print("};")

if __name__=="__main__":
    parser = argparse.ArgumentParser()

    parser.add_argument('-d','--dir',help='directory to place images in')
    parser.add_argument('-t','--table',help='generate code fragment',action='store_true')
    parser.add_argument('-s','--silent',help='silent mode',action='store_true')
    args = parser.parse_args()

    if args.table:
        produce_table()
    if args.dir:
        download_images(args.dir, args.silent)