#! /usr/bin/env python3
from __future__ import absolute_import
import time
start = time.time()

################################################################################
#
# Copyright (c) 2009 The MadGraph5_aMC@NLO Development team and Contributors
#
# This file is a part of the MadGraph5_aMC@NLO project, an application which 
# automatically generates Feynman diagrams and matrix elements for arbitrary
# high-energy processes in the Standard Model and beyond.
#
# It is subject to the MadGraph5_aMC@NLO license which should accompany this 
# distribution.
#
# For more information, visit madgraph.phys.ucl.ac.be and amcatnlo.web.cern.ch
#
################################################################################
"""This is the main executable, a simple frontend to set up the PYTHONPATH
and call immediately the command line interface scripts"""

import sys
if sys.version_info < (3, 7):
   sys.exit('MadGraph5_aMC@NLO works with python 3.7 or higher.\n\
              Please upgrade your version of python.')
    
try:
    import six
except ImportError:
    message = 'madgraph requires the six module. The easiest way to install it is to run "python -m pip install six --user"\n'
    message += 'in case of problem with pip, you can download the file at https://pypi.org/project/six/ . It has a single python file that you just need to put inside a directory of your $PYTHONPATH environment variable.'
    sys.exit(message)

import os
import optparse

# Get the parent directory (mg root) of the script real path (bin)
# and add it to the current PYTHONPATH

root_path = os.path.split(os.path.dirname(os.path.realpath( __file__ )))[0]
sys.path.insert(0, root_path)


# Write out nice usage message if called with -h or --help
usage = "usage: %prog [options] [FILE] "
parser = optparse.OptionParser(usage=usage)
parser.add_option("-l", "--logging", default='INFO',
                  help="logging level (DEBUG|INFO|WARNING|ERROR|CRITICAL) [%default]")
parser.add_option("-f", "--file", default='',
                    help="Use script file FILE")
parser.add_option("-d", "--mgme_dir", default='', dest = 'mgme_dir',
                  help="Use MG_ME directory MGME_DIR")
parser.add_option("","--web", action="store_true", default=False, dest='web', \
                 help='force to be in secure mode')
parser.add_option("","--debug", action="store_true", default=False, dest='debug', \
                 help='force to launch debug mode')
parser.add_option("-m", "--mode", dest="plugin",
                  help="Define some additional command provide by a PLUGIN")
parser.add_option("-s", "--nocaffeinate", action="store_false", default=True, dest='nosleep',
                  help='For mac user, forbids to use caffeinate when running with a script')                               
(options, args) = parser.parse_args()
if len(args) == 0:
    args = ''

import subprocess

# Check if optimize mode is (and should be) activated
if __debug__ and not options.debug and \
    (not os.path.exists(os.path.join(root_path, 'bin','create_release.py')) or options.web):
        os.system('%s -O -W ignore::DeprecationWarning %s' % (sys.executable, ' '.join(sys.argv)))
        sys.exit()

import logging
import logging.config
import madgraph.interface.coloring_logging

if ' ' in os.getcwd():
    logging.warning("\033[91mThe current working directory (%s) does contain spaces. We advise that you change the location of the code/working area to avoid to have space in such path.\033[0m", os.getcwd())


if sys.version_info[0] == 3 and sys.version_info[1] == 12:
    logging.warning("\033[91mpython3.12 support is still experimental. For the moment re-weighting is NOT working and do expect a LOT of syntax warning. We do not advise python3.12 for production for the moment.\033[0m")

try: 
    import readline
except ImportError:
    try:
        import pyreadline as readline
    except:
        print( "For tab completion and history, install module readline.")
else:
    import rlcompleter

    if 'r261:67515' in sys.version and  'GCC 4.2.1 (Apple Inc. build 5646)' in sys.version:
        readline.parse_and_bind("bind ^I rl_complete")
        readline.__doc__ = 'libedit'  
    
    elif hasattr(readline, '__doc__'):
        if 'libedit' not in readline.__doc__:
            readline.parse_and_bind("tab: complete")
        else:
            readline.parse_and_bind("bind ^I rl_complete")
    else:
        readline.__doc__ = 'GNU'
        readline.parse_and_bind("tab: complete")
        
    # charge history file
    try:
        legacy_state_dir = os.path.join(os.environ['HOME'], '.mg5')

        if os.path.exists(legacy_state_dir):
            state_dir = legacy_state_dir
        else:
            state_dir = os.getenv('XDG_STATE_HOME', os.path.join(os.environ['HOME'], '.local', 'state'))

        history_file = os.path.join(state_dir, "mg5history")
        readline.read_history_file(history_file)
    except:
        pass

try:
   import psyco
   psyco.full()
except:
   pass

if __debug__:
        print( 'Running MG5 in debug mode')

# Set logging level according to the logging level given by options
#logging.basicConfig(level=vars(logging)[options.logging])
try:
    if __debug__ and options.logging == 'INFO':
        options.logging = 'DEBUG'    
    if options.logging.isdigit():
        level = int(options.logging)
    else:
        level = eval('logging.' + options.logging)

    logging.config.fileConfig(os.path.join(root_path, 'madgraph', 'interface', '.mg5_logging.conf'))
    logging.root.setLevel(level)
    logging.getLogger('madgraph').setLevel(level)
    logging.getLogger('madevent').setLevel(level)
except:
    pass

import madgraph.interface.master_interface as interface

if __debug__ and time.time() - start > 0.5:
    print(( 'WARNING: loading of madgraph too slow!!!', time.time() - start))

try:
    import madgraph.various.misc as misc
    misc.EasterEgg('loading')
except:
    pass


if options.plugin:
    if not os.path.exists(os.path.join(root_path, 'PLUGIN', options.plugin)):
        try:
            __import__('MG5aMC_PLUGIN.%s' % options.plugin)
        except:
            print( "ERROR: %s is not present in the PLUGIN directory. Please install it first" % options.plugin)

    else:
        __import__('PLUGIN.%s' % options.plugin)
    plugin = sys.modules['PLUGIN.%s' % options.plugin]
    if not plugin.new_interface:
        logging.warning("Plugin: %s do not define dedicated interface and should be used without the --mode options" % options.plugin)
        sys.exit()
    import madgraph.various.misc as misc
    if not misc.is_plugin_supported(plugin):
        sys.exit()
    cmd_line = plugin.new_interface(mgme_dir = options.mgme_dir)
    cmd_line.plugin=options.plugin
elif options.web:
    cmd_line = interface.MasterCmdWeb()
else: 
    cmd_line = interface.MasterCmd(mgme_dir = options.mgme_dir)



# Call the cmd interface main loop
try:
    if options.file or args:
        if sys.platform == "darwin" and options.nosleep:
            logging.getLogger('madgraph').warning("launching caffeinate to prevent idle sleep when MG5aMC is running. Run './bin/mg5_aMC -s' to prevent this.")
            pid = os.getpid()
            subprocess.Popen(['caffeinate', '-i', '-w', str(pid)])
        # They are an input file 
        if args:
            input_file = os.path.realpath(args[0])
        else:
            input_file = os.path.realpath(options.file)
        if options.web:
            cmd_line.debug_output = os.path.join(os.path.dirname(input_file),'generation.log')
            cmd_line.use_rawinput = False
            cmd_line.haspiping = False
            cmd_line.run_cmd('import ' + input_file)
            cmd_line.run_cmd('quit')
        else:
            cmd_line.use_rawinput = False
            cmd_line.haspiping = False
            cmd_line.run_cmd('import ' + input_file)
            cmd_line.run_cmd('quit')
    else:
        # Interactive mode
        if options.web:
            if 'MADGRAPH_DATA' not in os.environ:
                os.environ['MADGRAPH_DATA'] = root_path
                os.environ['MADGRAPH_BASE'] = os.path.join(root_path,'input')
                os.environ['REMOTE_USER'] = 'webmode'
            cmd_line.cmdloop()
        else:
            cmd_line.cmdloop()
except KeyboardInterrupt:
    print('writting history and quit on KeyboardInterrupt') 
    pass

try:
    cmd_line.exec_cmd('quit all', printcmd=False)
    readline.set_history_length(100)
    if not os.path.exists(state_dir):
        os.mkdir(state_dir)
    readline.write_history_file(history_file)
except Exception as error:
    pass


    
