#!/usr/bin/env python3
"""
Update a builds manifest with info on a given build
"""
import argparse
import os
import sys
import shutil
import json
import traceback

DETAILS_URLS = {
    '4.0': 'https://www.zotero.org/support/4.0_changelog',
    '5.0': 'https://www.zotero.org/support/5.0_changelog',
}
MAJOR = False

parser = argparse.ArgumentParser(
    description='Update a builds manifest with info on a given build',
    formatter_class=argparse.ArgumentDefaultsHelpFormatter)

parser.add_argument('-f', '--file', required=True, help="path to updates.json")
parser.add_argument('-p', '--platforms', required=True, help="platforms ('m', 'w', 'l')")
parser.add_argument('-c', '--channel', required=True, help="release channel ('release', 'beta')")
parser.add_argument('-v', '--version', required=True, help='version number of build')
parser.add_argument('-b', '--build_id', required=True, help="build ID ('20160801142343')")

args = parser.parse_args()

def main():
    try:
        file = args.file
        platforms = args.platforms
        channel = args.channel
        version = args.version
        
        unknown_platforms = set(platforms) - set(['m', 'w', 'l'])
        if len(unknown_platforms) > 0:
            raise Exception("Invalid platform '{}'".format(unknown_platforms))
        
        # Back up JSON file
        shutil.copy2(file, file + '.bak')
        
        # Read in existing file
        with open(file) as f:
            updates = json.loads(f.read())
        
        if channel not in updates:
            updates[channel] = {}
        
        full_platforms = []
        if "m" in platforms:
            full_platforms.append("mac")
        if "w" in platforms:
            full_platforms.append("win32")
        if "l" in platforms:
            full_platforms.append("linux-i686")
            full_platforms.append("linux-x86_64")
        
        # Add info for current builds
        for platform in full_platforms:
            if platform not in updates[channel]:
                updates[channel][platform] = {}
            
            updates[channel][platform]['VERSION'] = version
            updates[channel][platform]['BUILD_ID'] = args.build_id
            
            if 'DETAILSURL' not in updates[channel][platform]:
                updates[channel][platform]['DETAILSURL'] = DETAILS_URLS[version[0:3]]
                updates[channel][platform]['MAJOR'] = MAJOR
        
        # Write new file
        updates = json.dumps(updates, indent=2)
        with open(file, 'w') as f:
            f.write(updates + "\n")
        
        print(updates)
        
        return 0
    
    except Exception as err:
        sys.stderr.write("\n" + traceback.format_exc())
        return 1

if __name__ == '__main__':
    sys.exit(main())
