""" Miscellaneous utilities. """

import os
import functools
import logging
import traceback
import json

from vasl_templates.webapp.config.constants import BASE_DIR

# ---------------------------------------------------------------------

def get_build_info():
    """Get the program build info."""

    # locate and load the build info file
    fname = os.path.join( BASE_DIR, "config", "build-info.json" )
    if not os.path.isfile( fname ):
        return None
    with open( fname, "r", encoding="utf-8" ) as fp:
        build_info = json.load( fp )

    # get the build timestamp
    result = { "timestamp": build_info["timestamp"] }

    # get the git info
    if "branch_name" in build_info:
        git_info = build_info[ "branch_name" ]
        if "last_commit_id" in build_info:
            git_info += ":{}".format( build_info["last_commit_id"][:8] )
        result["git_info"] = git_info

    return result

# ---------------------------------------------------------------------

def catch_exceptions( caption="EXCEPTION", retval=None ):
    """Decorator that handles exceptions thrown by the wrapped function.

    We have to wrap every callback fuction that the front-end invokes with this,
    otherwise an exception will cause the program to crash and die :-/
    """
    def decorator( func ):
        """The real decorator function."""
        @functools.wraps( func )
        def wrapper( *args, **kwargs ):
            """Wrapper around the function being decorated."""
            try:
                return func( *args, **kwargs )
            except Exception as ex: #pylint: disable=broad-except
                logging.critical( "%s: %s", caption, ex )
                logging.critical( traceback.format_exc() )
                from vasl_templates.main_window import MainWindow #pylint: disable=cyclic-import
                MainWindow.showErrorMsg( "Unexpected callback error:\n\n{}".format( str(ex) ) )
                return retval
        return wrapper
    return decorator

# ---------------------------------------------------------------------

def show_msg_store( msg_store ):
    """Show messages in a MsgStore."""

    # NOTE: It would be nice to show a single dialog with all the messages, each one tagged with
    # a pretty little icon, but for now, we just show a message box for each message :-/
    from vasl_templates.main_window import MainWindow
    for msg_type in ("error","warning"):
        for msg in msg_store.get_msgs( msg_type ):
            MainWindow.showErrorMsg( msg )
