#! /usr/bin/env python
#
# Copyright (C) 2017 Sony Interactive Entertainment Inc.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# 1.  Redistributions of source code must retain the above copyright
#     notice, this list of conditions and the following disclaimer.
# 2.  Redistributions in binary form must reproduce the above copyright
#     notice, this list of conditions and the following disclaimer in the
#     documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

import importlib
import json
import os.path
import sys
import zipfile

download = importlib.import_module('download-github-release')

repo = 'WebKitForWindows/WebKitRequirements'
file = 'WebKitRequirementsWin64.zip'
output = 'WebKitLibraries/win'
options = [repo, file, '-o', output]

# Check if there's a specific version to request
config_path = os.path.join(output, file) + '.config'
if os.path.exists(config_path):
    with open(config_path) as config_file:
        options += ['-r', json.load(config_file)['tag_name']]

result = download.main(options)

# Only unzip if required
if result == download.Status.DOWNLOADED:
    print('Extracting release to {}...'.format(output))
    zip = zipfile.ZipFile(os.path.join(output, file), 'r')
    zip.extractall(output)
    zip.close()
elif result == download.Status.COULD_NOT_FIND:
    sys.exit(1)
