from cement.core.controller import CementBaseController, expose
from cement.core import handler, hook
from ee.core.download import EEDownload
from ee.core.logging import Log
import time
import os


def ee_update_hook(app):
    # do something with the ``app`` object here.
    pass


class EEUpdateController(CementBaseController):
    class Meta:
        label = 'ee_update'
        stacked_on = 'base'
        aliases = ['update']
        aliases_only = True
        stacked_type = 'nested'
        description = ('update EasyEngine to latest version')
        usage = "ee update"

    @expose(hide=True)
    def default(self):
        filename = "eeupdate" + time.strftime("%Y%m%d-%H%M%S")
        EEDownload.download(self, [["http://rt.cx/eeup",
                                    "/tmp/{0}".format(filename),
                                    "update script"]])
        try:
            Log.info(self, "updating EasyEngine, please wait...")
            os.system("bash /tmp/{0}".format(filename))
        except OSError as e:
            Log.debug(self, str(e))
            Log.error(self, "EasyEngine update failed !")
        except Exception as e:
            Log.debug(self, str(e))
            Log.error(self, "EasyEngine update failed !")


def load(app):
    # register the plugin class.. this only happens if the plugin is enabled
    handler.register(EEUpdateController)
    # register a hook (function) to run after arguments are parsed.
    hook.register('post_argument_parsing', ee_update_hook)