# Copyright (c) 2012-2014 The CEF Python authors. All rights reserved.
# License: New BSD License.
# Website: http://code.google.com/p/cefpython/

# Create a setup package.

import sys
import os
import re
import platform
import shutil
import glob
import sysconfig
import subprocess
import struct

PACKAGE_NAME = "cefpython3"

# Bits
BITS = platform.architecture()[0]
assert (BITS == "32bit" or BITS == "64bit")
if BITS == "32bit":
    LINUX_BITS = "linux32"
else:
    LINUX_BITS = "linux64"

# Architecture and OS postfixes
ARCH32 = (8 * struct.calcsize('P') == 32)
ARCH64 = (8 * struct.calcsize('P') == 64)
OS_POSTFIX = ("win" if platform.system() == "Windows" else
              "linux" if platform.system() == "Linux" else
              "mac" if platform.system() == "Darwin" else "unknown")
OS_POSTFIX2 = "unknown"
if OS_POSTFIX == "win":
    OS_POSTFIX2 = "win32" if ARCH32 else "win64"
elif OS_POSTFIX == "mac":
    OS_POSTFIX2 = "mac32" if ARCH32 else "mac64"
elif OS_POSTFIX == "linux":
    OS_POSTFIX2 = "linux32" if ARCH32 else "linux64"

# Directories
INSTALLER_DIR = os.path.dirname(os.path.abspath(__file__))
LINUX_DIR = os.path.abspath(os.path.join(INSTALLER_DIR, ".."))
SRC_DIR = os.path.abspath(os.path.join(LINUX_DIR, ".."))
CEFPYTHON_DIR = os.path.abspath(os.path.join(SRC_DIR, ".."))
BUILD_DIR = os.path.abspath(os.path.join(CEFPYTHON_DIR, "build"))
CEF_BINARY = os.path.abspath(os.path.join(BUILD_DIR, "cef_"+OS_POSTFIX2))
CEFPYTHON_BINARY = os.path.abspath(os.path.join(BUILD_DIR,
                                                "cefpython_"+OS_POSTFIX2))

# Check directories
assert os.path.exists(CEF_BINARY)
assert os.path.exists(CEFPYTHON_BINARY)

README_FILE = os.getcwd()+r"/README.txt"
INIT_TEMPLATE = os.getcwd()+r"/__init__.py.template"
SETUP_TEMPLATE = os.getcwd()+r"/setup.py.template"
# SETUP_CFG_TEMPLATE = os.getcwd()+r"/setup.cfg.template"


def str_format(string, dictionary):
    orig_string = string
    for key, value in dictionary.items():
        string = string.replace("%("+key+")s", value)
    if string == orig_string:
        raise Exception("Nothing to format")
    if re.search(r"%\([a-zA-Z0-9_]+\)s", string):
        raise Exception("Not all strings formatted")
    return string


def main():
    args = ' '.join(sys.argv)
    match = re.search(r"\d+\.\d+", args)
    if match:
        version = match.group(0)
    else:
        print("Usage make-setup.py {version}")
        sys.exit(1)

    template_vars = dict()
    template_vars["APP_VERSION"] = version
    template_vars["PLATFORM"] = sysconfig.get_platform()
    template_vars["PY_VERSION_DIGITS_ONLY"] = (
            str(sys.version_info.major) +
            str(sys.version_info.minor))  # e.g. "27" or "34"

    print("Reading template: %s" % README_FILE)
    f = open(README_FILE)
    README_CONTENT = f.read()
    f.close()

    print("Reading template: %s" % INIT_TEMPLATE)
    f = open(INIT_TEMPLATE)
    INIT_CONTENT = str_format(f.read(), template_vars)
    f.close()

    print("Reading template: %s" % SETUP_TEMPLATE)
    f = open(SETUP_TEMPLATE)
    SETUP_CONTENT = str_format(f.read(), template_vars)
    f.close()

    # print("Reading template: %s" % SETUP_CFG_TEMPLATE)
    # f = open(SETUP_CFG_TEMPLATE)
    # SETUP_CFG_CONTENT = str_format(f.read(), template_vars)
    # f.close()

    setup_dir = (INSTALLER_DIR + "/" + PACKAGE_NAME+"-" +
                 template_vars["APP_VERSION"] + "-" + OS_POSTFIX2 + "-setup")
    print("Creating setup dir: "+setup_dir)
    os.mkdir(setup_dir)

    package_dir = setup_dir+"/"+PACKAGE_NAME
    print("Creating package dir")
    os.mkdir(package_dir)

    print("Copying License file")
    shutil.copy("../../../License", package_dir)

    print("Creating README.txt from template")
    with open(setup_dir+"/README.txt", "w") as f:
        f.write(README_CONTENT)

    print("Creating setup.py from template")
    with open(setup_dir+"/setup.py", "w") as f:
        f.write(SETUP_CONTENT)

    # print("Creating setup.cfg from template")
    # with open(setup_dir+"/setup.cfg", "w") as f:
    #     f.write(SETUP_CFG_CONTENT)

    print("Copying binaries to package dir")
    # Copy Kivy
    old_binaries_dir = os.path.abspath(INSTALLER_DIR+"/../binaries_"+BITS+"/")
    ret = os.system("cp -rf "+old_binaries_dir+"/kivy_.py "+package_dir)
    assert ret == 0
    ret = os.system("cp -rf "+old_binaries_dir+"/kivy-select-boxes/ "
                    + package_dir)
    assert ret == 0
    # Copy binaries
    ret = os.system("cp -rf "+CEF_BINARY+"/*.txt "+package_dir)
    assert ret == 0
    ret = os.system("cp -rf "+CEF_BINARY+"/bin/* "+package_dir)
    assert ret == 0
    ret = os.system("cp -rf "+CEFPYTHON_BINARY+"/* "+package_dir)
    assert ret == 0

    os.chdir(package_dir)
    print("Removing .log files from the package dir")
    os.system("rm *.log")
    # assert ret == 0 - if there are no .log files this assert would fail.
    os.chdir(INSTALLER_DIR)

    print("Creating __init__.py from template")
    with open(package_dir+"/__init__.py", "w") as f:
        f.write(INIT_CONTENT)

    print("Creating examples dir in package dir")
    os.mkdir(package_dir+"/examples/")

    print("Copying root examples/ directory")
    ret = os.system("rm ../../../examples/*.log")
    ret = os.system("cp -r ../../../examples/* "+package_dir+"/examples/")
    assert ret == 0

    print("Moving kivy-select-boxes dir to examples dir")
    assert os.path.exists(package_dir+"/kivy-select-boxes")
    shutil.move(package_dir+"/kivy-select-boxes",
                package_dir+"/examples/kivy-select-boxes")

    print("Creating wx dir in package dir")
    os.mkdir(package_dir+"/wx/")

    print("Moving example scripts from package dir to examples dir")
    examples = glob.glob(package_dir+"/*.py")
    for example in examples:
        # Ignore: cefpython_py27.py - dummy API script
        if os.path.basename(example).startswith("cefpython_"):
            continue
        # Ignore: __init__.py
        if os.path.basename(example).startswith("__"):
            continue
        os.rename(example, package_dir+"/examples/"+os.path.basename(example))
    ret = os.system("mv "+package_dir+"/*.html "+package_dir+"/examples/")
    # assert ret == 0
    ret = os.system("mv "+package_dir+"/*.js "+package_dir+"/examples/")
    # assert ret == 0
    ret = os.system("mv "+package_dir+"/*.css "+package_dir+"/examples/")
    # assert ret == 0

    print("Copying wx/ to package dir")
    wx_subpackage_dir = os.path.abspath(INSTALLER_DIR+"/../../cefpython3.wx/")
    ret = os.system("cp -rf " + wx_subpackage_dir + "/* " + package_dir
                    + "/wx/")
    assert ret == 0

    # print("Moving wx examples from wx/examples to examples/wx")
    # shutil.move(package_dir+"/wx/examples", package_dir+"/wx/wx/")
    # shutil.move(package_dir+"/wx/wx/", package_dir+"/examples/")

    print("Copying package dir examples to setup dir")
    ret = os.system("cp -rf "+package_dir+"/examples/ "+setup_dir+"/examples/")
    assert ret == 0

    # Create empty debug.log files so that package uninstalls cleanly
    # in case examples were launched. Issue 149.
    debug_log_dirs = [package_dir, 
                      package_dir+"/examples/", 
                      # package_dir+"/examples/wx/"
                     ]
    for curdir in debug_log_dirs:
        print("Creating empty debug.log in %s" % curdir)
        with open(curdir+"/debug.log", "w") as f:
            f.write("")
        # Set write permissions so that Wheel package files have it
        # right. So that examples may be run from package directory.
        subprocess.call("chmod 666 %s/debug.log" % curdir, shell=True)

    print("Setup Package created successfully.")

if __name__ == "__main__":
    main()
