#!/usr/bin/python
#
# Copyright 2016 The ANGLE Project Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#
# update_canary_angle.py:
#   Helper script that copies Windows ANGLE DLLs into the Canary
#   application directory. Much faster than compiling Chrome from
#   source. The script checks for the most recent DLLs in a set of
#   search paths, and copies that into the most recent Canary
#   binary folder. Only works on Windows.

import sys, os, shutil

# Set of search paths.
source_paths = [
    os.path.join('..', 'gyp', 'Debug_x64'),
    os.path.join('..', 'gyp', 'Debug_Win32'),
    os.path.join('..', 'gyp', 'Release_x64'),
    os.path.join('..', 'gyp', 'Release_Win32'),
    os.path.join('..', 'out', 'Debug'),
    os.path.join('..', 'out', 'Debug_x64'),
    os.path.join('..', 'out', 'Release'),
    os.path.join('..', 'out', 'Release_x64'),
]

script_dir = os.path.dirname(sys.argv[0])

# Default Canary installation path.
chrome_folder = os.path.join(os.environ['LOCALAPPDATA'], 'Google', 'Chrome SxS', 'Application')

# Find the most recent ANGLE DLLs
binary_name = 'libGLESv2.dll'
newest_folder = None
newest_mtime = None
for path in source_paths:
    binary_path = os.path.join(script_dir, path, binary_name)
    if os.path.exists(binary_path):
        binary_mtime = os.path.getmtime(binary_path)
        if (newest_folder is None) or (binary_mtime > newest_mtime):
            newest_folder = os.path.join(script_dir, path)
            newest_mtime = binary_mtime

if newest_folder is None:
    sys.exit("Could not find ANGLE DLLs!")

source_folder = newest_folder

# Is a folder a chrome binary directory?
def is_chrome_bin(str):
    chrome_file = os.path.join(chrome_folder, str)
    return os.path.isdir(chrome_file) and all([char.isdigit() or char == '.' for char in str])

sorted_chrome_bins = sorted([folder for folder in os.listdir(chrome_folder) if is_chrome_bin(folder)], reverse=True)

dest_folder = os.path.join(chrome_folder, sorted_chrome_bins[0])

print('Copying DLLs from ' + source_folder + ' to ' + dest_folder + '.')

for dll in ['libGLESv2.dll', 'libEGL.dll']:
    src = os.path.join(source_folder, dll)
    if os.path.exists(src):
        # Make a backup of the original unmodified DLLs if they are present.
        backup = os.path.join(source_folder, dll + '.backup')
        if not os.path.exists(backup):
            shutil.copyfile(src, backup)
        shutil.copyfile(src, os.path.join(dest_folder, dll))
