#!/usr/bin/env python

from mTree.server.server import Server, MTreeController
from mTree.server.admin import admin_area
from mTree.microeconomic_system.agent import Agent


import importlib
import inspect
import os
import glob

import importlib.util
import sys

# For illustrative purposes.
import tokenize


def import_plugins(plugins_package_directory_path, base_class=None, create_instance=True, filter_abstract=True):


    print("ATTEMPTING TO LOOK AT THINGS...")
    plugins_package_name = os.path.basename(plugins_package_directory_path)
    print(plugins_package_name)

    # -----------------------------
    # Iterate all python files within that directory
    plugin_file_paths = glob.glob(os.path.join(plugins_package_directory_path, "*.py"))
    print(os.path.join(plugins_package_directory_path, "*.py"))
    print(plugin_file_paths)
    print("trying to load all known files")
    for plugin_file_path in plugin_file_paths:
        print("Examining a file...: " + plugin_file_path)
        plugin_file_name = os.path.basename(plugin_file_path)
        print("plugin name")
        print(plugin_file_path)
        module_name = os.path.splitext(plugin_file_name)[0]
        print(module_name)
        if module_name.startswith("__"):
            continue

        # -----------------------------
        # Import python file

        module = importlib.import_module("." + module_name) #\, package=plugins_package_name)
    '''
        # -----------------------------
        # Iterate items inside imported python file

        for item in dir(module):
            value = getattr(module, item)
            if not value:
                continue

            if not inspect.isclass(value):
                continue

            if filter_abstract and inspect.isabstract(value):
                continue

            if base_class is not None:
                if type(value) != type(base_class):
                    continue

            # -----------------------------
            # Instantiate / return type (depends on create_instance)

            yield value() if create_instance else value
    '''

print("Trying to load local directory packages")
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
#SCRIPT_DIR = "/repos/mTree_dev_folder"
plugins_directory_path = os.path.join(SCRIPT_DIR, 'components')
print("PLUGINS DIRECTORY")
print(plugins_directory_path)
print(os.getcwd())
#plugins = import_plugins(plugins_directory_path, base_class=Agent)
#plugins = import_plugins(os.path.join(os.getcwd(), 'components'), base_class=Agent)


file_path = "/repos/mTree_dev_folder/components/basic_agent.py"
module_name = "mTree.components"
print("aslkfj")
print(file_path)
print(module_name)

spec = importlib.util.spec_from_file_location(module_name, file_path)
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
# Optional; only necessary if you want to be able to import the module
# by name later.
sys.modules[module_name] = module

print("module list")
#print(sys.modules)

from mTree.components import *
t = BasicAgent()

#importlib.import_module(".components.base_agent", package='packageser')

#import_plugins("/repos/mTree_dev_folder/components")

#SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
#plugins_directory_path = os.path.join(SCRIPT_DIR, 'plugins')
#plugins = import_plugins(plugins_directory_path, base_class=Agent)

#for plugin in plugins:
#    plugin.foo()


print("mTree is launching")
server = Server()
mtree_controller = MTreeController()
mtree_controller.run()



#server.attach_experiment(InformationCascades)
#server.run_server()
#server.register_blueprint(admin_area)
#server.list_rules()
#server.run()
print("thinking")
