#!/usr/bin/env python
#
# TakeNote - note-taking and organization
# Matt Rasmussen 2008
#


# python imports
import sys, os, time, optparse, exceptions, traceback
from os.path import basename, dirname, realpath, join, isdir

# pygtk imports
import pygtk
pygtk.require('2.0')
import gtk


#=============================================================================
# TakeNote import

"""
Three ways to run TakeNote

(1) directly from source dir
    
    pkgdir = bin_path + "../takenote"
    basedir = pkgdir
    sys.path.append(pkgdir)

    src/bin/takenote
    src/takenote/__init__.py
    src/takenote/images
    src/takenote/rc

(2) from installation location by setup.py 

    basedir = takenote.get_basedir()

    prefix/bin/takenote
    prefix/lib/python-XXX/site-packages/takenote/__init__.py
    prefix/lib/python-XXX/site-packages/takenote/images
    prefix/lib/python-XXX/site-packages/takenote/rc
    

(3) windows py2exe dir

    pkgdir = bin_path
    basedir = bin_path

    dir/takenote.exe
    dir/library.zip
    dir/images
    dir/rc

"""

try:
    # try to import from python path first
    import takenote
    
    # sucessful import, therefore we are running with (2) or (3)
    
    # attempt to use basedir for (2)
    basedir = takenote.get_basedir()
    
    if not isdir(join(basedir, "images")):
        # we must be running (3)
        basedir = dirname(realpath(sys.argv[0]))
    
except ImportError:
    # try to infer takenote lib path from program path
    pkgdir = dirname(dirname(realpath(sys.argv[0])))
    sys.path.append(pkgdir)
    import takenote
    
    # if this works we know we are running from src_path (1)
    basedir = takenote.get_basedir()

    
import takenote.gui.main_window



#=============================================================================
# options

o = optparse.OptionParser(usage=
                "%prog [options] [NOTEBOOK]")
o.set_defaults(default_notebook=True)
o.add_option("", "--show-errors", dest="show_errors",
             action="store_true",
             help="show errors on console")
o.add_option("--no-show-errors", dest="show_errors",
             action="store_false",
             help="do not show errors on console")
o.add_option("--no-default", dest="default_notebook",
             action="store_false",
             help="do not open default notebook")


def start_error_log(show_errors):
    """Starts TakeNote error log"""
    
    errorlog = open(takenote.get_user_error_log(), "a")
    if show_errors:
        sys.stderr = takenote.TeeFileStream([sys.stderr, errorlog],
                                            autoflush=True)
    else:
        sys.stderr = errorlog
    

    sys.stderr.write("==============================================\n"
                     "TakeNote: %s\n" % time.asctime())    


def main(argv):
    """Main execution"""

    # set default arguments
    options = o.get_default_values()    
    if takenote.get_platform() == "windows":        
        options.show_errors = False
    else:
        options.show_errors = True

    # parse args
    (options, args) = o.parse_args(argv[1:], options)
    
    
    # init preference dir
    if not os.path.exists(takenote.get_user_pref_dir()):            
        os.mkdir(takenote.get_user_pref_dir())

    # start error log
    start_error_log(options.show_errors)
        
    # read preferences
    app = takenote.TakeNote(basedir)
    

    # start TakeNote
    if len(args) > 0:
        # open specified notebook
        app.open_notebook(args[0].rstrip("/"))
        
    elif options.default_notebook and app.pref.default_notebook != "":
        # open default notebook
        app.open_notebook(app.pref.default_notebook)
        
    else:
        app.show_main_window()

    gtk.main()
    


try:
    main(sys.argv)
    
except exceptions.SystemExit, e:
    # sys.exit() was called
    pass

except Exception, e:
    traceback.print_exc()
    
    # flush final errors
    sys.stderr.flush()
    
