#!/usr/bin/env python2
# -*- coding: utf-8 -*-
import functools
import logging
import os
import struct

BOLD = "\033[1m"
RED = "\033[91m"
CLEAR = "\033[0m"
LLDBAGILITY = BOLD + RED + "LLDBagility" + CLEAR


def p32(i):
    return struct.pack("<I", i)


def p64(i):
    return struct.pack("<Q", i)


def u32(s):
    return struct.unpack("<I", s)[0]


def u64(s):
    return struct.unpack("<Q", s)[0]


def create_logger(name, filename):
    filehandler = logging.FileHandler(filename, mode="w")
    filehandler.setFormatter(
        logging.Formatter("%(asctime)s %(name)s %(levelname)s %(message)s")
    )
    logger = logging.getLogger(name)
    logger.propagate = False
    logger.addHandler(filehandler)
    logger.setLevel(os.getenv("LOGLEVEL", default="WARNING").upper())
    return logger


def create_indented_logger(name, filename):
    filehandler = logging.FileHandler(filename, mode="w")
    filehandler.setFormatter(
        logging.Formatter("%(asctime)s %(name)s %(levelname)s %(prefix)s%(message)s")
    )
    logger = logging.getLogger(name)
    logger.propagate = False
    logger.addHandler(filehandler)
    logger.setLevel(os.getenv("LOGLEVEL", default="WARNING").upper())
    return logging.LoggerAdapter(logger, {"prefix": ""})


# https://stackoverflow.com/questions/26853675/nested-prefixes-accross-loggers-in-python
def indented(logger, prefix=list()):
    def decorator(f):
        @functools.wraps(f)
        def _wrapper(*args, **kwargs):
            prefix.append("")
            logger.extra["prefix"] = "|  ".join(prefix)
            res = f(*args, **kwargs)
            prefix.pop()
            logger.extra["prefix"] = "|  ".join(prefix)
            return res

        return _wrapper

    return decorator


# https://github.com/GrahamDumpleton/wrapt/blob/4ee35415a4b0d570ee6a9b3a14a6931441aeab4b/blog/07-the-missing-synchronized-decorator.md
def synchronized(f):
    @functools.wraps(f)
    def _wrapper(self, *args, **kwargs):
        with self.lock:
            return f(self, *args, **kwargs)

    return _wrapper