#! /usr/bin/env python3
"""pyWindeployqt

This is a wrapper for  mingw32 objdump replacing windeployqt which is missing from MXE
I don't know why they disabled it, but here it is.

Example:
./deploy.py --build=~/ClionProjects/project/build/ \
--objdump=/home/user/mxe/usr/bin/i686-w64-mingw32.shared-objdump \
~/ClionProjects/project/build/project.exe;

"""

__author__ = 'Alexey Elymanov (strangeqargo@gmail.com)'

import subprocess
import os
import sys
import re
import os.path

import argparse
parser = argparse.ArgumentParser()

parser.add_argument(
    "--build", help="where to place libraries, optional, files will go to target location by default")
parser.add_argument(
    "--objdump", help="objdump executable (/home/user/mxe/usr/bin/i686-w64-mingw32.shared-objdump)")
parser.add_argument(
    "--libs", help="where to search for libraries (optional) infers from objdump")
parser.add_argument("target")

args = parser.parse_args()
if len(sys.argv) == 1 or not (args.libs or args.objdump):
    parser.print_help()
    sys.exit(1)

target = os.path.expanduser(args.target)
objdump_path = os.path.expanduser(args.objdump)

if not args.build:
    build_path = os.path.expanduser(os.path.dirname(args.target)) + "/"
else:
    build_path = os.path.expanduser(args.build)

libs = args.libs
if not args.libs:
    libs = objdump_path.replace('/bin', '').replace('-objdump', '')


# build_path = "/home/user/ClionProjects/project/build/"
# libs = "/home/user/mxe/usr/i686-w64-mingw32.shared"
# objdump_path = "/home/user/mxe/usr/bin/i686-w64-mingw32.shared-objdump"
# target = "project.exe"


def run_check():
    return subprocess.getoutput("wine project.exe")


def find_dll(dll):
    out = subprocess.getoutput("find " + libs + " | grep -i '" + dll + "$'")
    return out.strip('\n')


def library_install_exe(out=''):
    out = run_check().splitlines()
    for line in out:
        # err = re.search('(err:module:import_dll (Library |Loading library)) (.*?\.dll) ', line)
        err = re.search('([^ ]+\.dll) \(which', line)
        if err is not None:

            dll = err.group(1)
            dll = find_dll(dll)
            if dll is not None:
                copy_command = "cp " + dll + " " + build_path
                print("copy: ", copy_command)
                subprocess.getoutput(copy_command)
            library_install_exe(out)


def library_install_objdump(path, level):
    if path in skip_libs or path in done:
        return

    if level > 0:
        lib = find_dll(path)
        if lib == "":  # not found
            skip_libs.append(path)
            print("Not found: " + path)
            return
        print(lib)
        subprocess.getoutput("cp " + lib + " " + build_path)

    else:
        print("Processing target " + path)
        lib = path

    done.append(path)

    command = objdump_path + " -p " + lib + " | grep -o ': .*\.dll$'"
    res = subprocess.getstatusoutput(command)
    if (res[0] > 0):
        print("Error: objdump failed with " + lib)
    else:
        dlls = subprocess.getoutput(command).split("\n")
        for line in dlls:
            dll = (line.split(": "))[1]
            if dll not in done and dll not in skip_libs:
                level += 1
                library_install_objdump(dll, level)


skip_libs = list()
done = list()


def main():

    os.chdir(build_path)

    # library_install_exe(target)
    library_install_objdump(target, 0)

    pass


main()