# startup.py
#
"The main application startup code for PythonWin."

#
# This does the basic command line handling.

# Keep this as short as possible, cos error output is only redirected if
# this runs OK.  Errors in imported modules are much better - the messages go somewhere (not any more :-)

import sys
import os
import win32api
import win32ui

if not sys.argv:
    # Initialize sys.argv from commandline. When sys.argv is empty list (
    # different from [''] meaning "no cmd line arguments" ), then C
    # bootstrapping or another method of invocation failed to initialize
    # sys.argv and it will be done here. ( This was a workaround for a bug in
    # win32ui but is retained for other situations. )
    argv = win32api.CommandLineToArgv(win32api.GetCommandLine())
    sys.argv = argv[1:]
    if os.getcwd() not in sys.path and "." not in sys.path:
        sys.path.insert(0, os.getcwd())

# You may wish to redirect error output somewhere useful if you have startup errors.
# eg, 'import win32traceutil' will do this for you.
# import win32traceutil # Just uncomment this line to see error output!

# An old class I used to use - generally only useful if Pythonwin is running under MSVC
# class DebugOutput:
# 	softspace=1
# 	def write(self,message):
# 		win32ui.OutputDebug(message)
# sys.stderr=sys.stdout=DebugOutput()

# To fix a problem with Pythonwin when started from the Pythonwin directory,
# we update the pywin path to ensure it is absolute.
# If it is indeed relative, it will be relative to our current directory.
# If its already absolute, then this will have no affect.
import pywin, pywin.framework

pywin.__path__[0] = win32ui.FullPath(pywin.__path__[0])
pywin.framework.__path__[0] = win32ui.FullPath(pywin.framework.__path__[0])

# make a few wierd sys values.  This is so later we can clobber sys.argv to trick
# scripts when running under a GUI environment.

moduleName = "pywin.framework.intpyapp"
sys.appargvoffset = 0
sys.appargv = sys.argv[:]
# Must check for /app param here.
if len(sys.argv) >= 2 and sys.argv[0].lower() in ("/app", "-app"):
    from . import cmdline

    moduleName = cmdline.FixArgFileName(sys.argv[1])
    sys.appargvoffset = 2
    newargv = sys.argv[sys.appargvoffset :]
    # 	newargv.insert(0, sys.argv[0])
    sys.argv = newargv

# Import the application module.
__import__(moduleName)

try:
    win32ui.GetApp()._obj_
    # This worked - an app already exists - do nothing more
except (AttributeError, win32ui.error):
    # This means either no app object exists at all, or the one
    # that does exist does not have a Python class (ie, was created
    # by the host .EXE).  In this case, we do the "old style" init...
    from . import app

    if app.AppBuilder is None:
        raise TypeError("No application object has been registered")

    app.App = app.AppBuilder()
