import os
import time
import logging
import traceback

from datetime import datetime, timedelta
from pathlib import Path

from functools import wraps

###########
# LOGGING #
###########

logger = logging.getLogger("acoused")

#########
# WRAPS #
#########

def trace(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        t = time.time()
        head = f"[TRACE]"
        logger.debug(
            f"{head} Call {func.__module__}." +
            f"{func.__qualname__}({args}, {kwargs})"
        )

        value = func(*args, **kwargs)

        t1 = time.time()
        logger.debug(
            f"{head} Return {func.__module__}." +
            f"{func.__qualname__}: {value}"
        )
        logger.debug(
            f"{head}[TIME] {func.__module__}." +
            f"{func.__qualname__}: {t1-t} sec"
        )

        return value

    return wrapper
