#!/usr/bin/python

import sys
import os
from getopt import getopt
import cPickle
import pygtk
pygtk.require("2.0")
import gtk

# this will be replaced through install to point to e.g. /usr/lib/scicraft on
# debian/ubuntu, or whatever other directory is used
PATH_TO_PACKAGE = "/usr/lib/scicraft-ng/"

if PATH_TO_PACKAGE:
    sys.path.insert(0, PATH_TO_PACKAGE)

# Must be set up before RPY is imported
if '--fakestds' in sys.argv:
    class FakeStream:
        def flush(self): pass
        def write(self, x): pass
    sys.stdout = FakeStream()
    sys.stderr = FakeStream()

from system import scicraftapp, project, workflow, logger, workflowimport
import workflows
from workflows import chemometrics_workflow




PROGRAM_NAME = 'scicraft'
VERSION = '1.0.2'


parameters = {'workflow': chemometrics_workflow.ChemometricsWorkflow}

def show_help():
    print 'SciCraft %s' % VERSION
    print 'This software is released under the GNU General Public Licence'
    print
    print 'Usage: %s [options] [projectfile]' % os.path.split(sys.argv[0])[1]
    print 
    print 'Description:'
    print '    SciCraft is a powerful open source data analysis software.'
    print
    print 'Options:'
    print '    -h --help              Show this help text'
    print '    -l --list-workflows    Lists available workflows'
    print '    -w --workflow=<wf>     Generates a new project based on workflow wf.'
    print '    --fakestds             Enable if stdout/err not available (pythonw).'
    print

def list_workflows():
    print 'scicraft %s' % VERSION
    print
    print 'Workflows:'

    wfs = workflowimport.workflow_list()
    for wf in wfs:
        print '    %s (%s)' % (wf.ident, wf.name)
    print

def parse_options():
    short_opts = 'hlw:'
    long_opts = ['help', 'list-workflows', 'workflow=', 'fakestds']

    options, params = getopt(sys.argv[1:], short_opts, long_opts)

    for opt, val in options:
        if opt in ['-h', '--help']:
            show_help()
            sys.exit(0)
        elif opt in ['-l', '--list-workflows']:
            list_workflows()
            sys.exit(0)
        elif opt in ['-w', '--workflow']:
            wfs = workflow.workflow_list()
            for wf in wfs:
                if wf.ident == val:
                    parameters['workflow'] = wf
            parameters['workflow']
                               
    if len(params) > 1:
        show_help()
        sys.exit(0)
    elif params:
        return params[0]
    else:
        return None


if __name__ == '__main__':
    
    filename = parse_options()
    
    if filename:
        p = project.Project(filename)
        # make sure workflows are imported for unpickling to work
        workflowimport.workflow_list()
        p.import_data_tree(cPickle.load(open(filename, "rb")))
    else:
        p = project.Project()

    app = scicraftapp.SciCraftApp(parameters['workflow'])
    app.set_version(VERSION)
    app.set_project(p)

    # we create a settings directory as some functions depend on it
    if os.name == "posix":
        path = os.path.join(os.getenv("HOME"), ".scicraft-ng")
        if not os.path.exists(path):
            logger.log("notice", "Creating settings directory: " + path)
            os.mkdir(path)
    gtk.main()

