#!/usr/bin/env python3

import argparse
import os
import signal
import subprocess
import sys
import time

REAL_PATH = __file__

for i in range(20):
    if os.path.islink(REAL_PATH):
        print(f"Replacing symlink: {REAL_PATH}")
        REAL_PATH = os.readlink(REAL_PATH)
    else:
        break

if os.path.islink(REAL_PATH):
    print("You clearly messed something up, what are you trying to do?")
    exit(1)

VERSION = "stargate"

DESKTOP_FILE = """\
[Desktop Entry]
Type=Application
Name=StargateDAW
Comment=Digital Audio Workstation
Exec={EXEC}
Icon={ICON}
"""

def app_image_start_menu():
    import shutil
    appimage = os.environ['APPIMAGE']
    appdir = os.environ['APPDIR']
    parent = os.path.dirname(appimage)
    icon = os.path.join(
        appdir,
        'opt',
        'python3.10',
        'share',
        'pixmaps',
        'stargate.png',
    )
    icon_copy = os.path.join(parent, 'stargate.png')
    shutil.copy(icon, icon_copy)
    desktop_dir = os.path.join(
        os.path.expanduser('~'),
        '.local',
        'share',
        'applications',
    )
    os.makedirs(desktop_dir, exist_ok=True)
    desktop_file = DESKTOP_FILE.format(EXEC=appimage, ICON=icon_copy)
    desktop_path = os.path.join(desktop_dir, 'stargate.desktop')
    with open(desktop_path, 'w') as f:
        f.write(desktop_file)
    exit(0)


def parse_args():
    parser = argparse.ArgumentParser(
        description="Launch Stargate DAW",
    )
    if 'APPDIR' in os.environ:
        help_msg = (
            'The project file to open, or use "appimage-start-menu" to '
            'install to the start menu'
        )
    else:
        help_msg = 'The project file to open'
    parser.add_argument(
        'project_file',
        default=None,
        help=help_msg,
        nargs='?',
    )
    parser.add_argument(
        '--create',
        action='store_true',
        default=False,
        dest='create',
        help='Create the project if it does not exist',
    )
    args = parser.parse_args()
    if args.project_file is not None:
        if (
            'APPIMAGE' in os.environ
            and
            args.project_file == 'appimage-start-menu'
        ):
            app_image_start_menu()
        assert os.path.basename(args.project_file) == f'{VERSION}.project', (
            f"File must be in the format '/path/to/{VERSION}.project', "
            f"got '{args.project_file}'"
        )
        assert args.create or os.path.isfile(args.project_file), \
            f"{args.project_file} does not exist"
    return args

def start_paulstretch():
    from sglib.lib.paulstretch import main as ps_main
    ps_main()

def start_stargate():
    args = parse_args()
    from sgui._main import main as sg_main
    sg_main(args)

def main():
    # When respawning, give the old process a chance to garbage collect first
    if "--delay" in sys.argv:
        sys.argv.remove("--delay")
        time.sleep(1)

    is_paulstretch = False
    if len(sys.argv) >= 2 and sys.argv[1] == 'paulstretch':
        is_paulstretch = True
        sys.argv.pop(1)

    f_prefix_dir = os.path.dirname(REAL_PATH)
    f_path = os.path.join(
        f_prefix_dir,
        "..",
    )
    f_path = os.path.abspath(f_path)
    sys.path.insert(0, f_path)
    print(f'sys.path = {sys.path}')
    try:
        if is_paulstretch:
            start_paulstretch()
        else:
            start_stargate()
        return
    except ImportError:
        print(
            "Did not detect local development environment, trying "
            "system installation",
        )
    f_path = os.path.join(
        f_prefix_dir,
        "..",
        "share",
        VERSION,
        "stargate",
    )
    f_path = os.path.abspath(f_path)
    sys.path.insert(0, f_path)
    print(f'sys.path = {sys.path}')
    if is_paulstretch:
        start_paulstretch()
    else:
        start_stargate()

if __name__ == "__main__":
    main()
