import logging

DEFAULT_LOGGER = 'loggly_web'
FEATURE_LOGGER = 'loggly_feature'
logs = None
feature_logger = None

def _get_user():
    request = _get_request()

    unique_id = None
    user = None

    if request:
        if (hasattr(request,'user') and hasattr(request.user,'username') and
            len(request.user.username))>0:

            user = unicode(request.user.username).strip()

        if hasattr(request,'META') and request.META.has_key('UNIQUE_ID'):
            unique_id = unicode(request.META['UNIQUE_ID']).strip()

    return user, unique_id


def logHelper(rest=None, user=None, status=None):

    global logs
    output = list()
    discover_user = False

    # get the logger
    if not logs:
        logs = logging.getLogger(DEFAULT_LOGGER)

    user_2, unique_id = _get_user()

    # if a user was passed in, use that one
    if user:
        output.append("user="+unicode(user))
    elif user_2:
        output.append("user="+unicode(user_2))

    if unique_id:
        output.append("request_id=%s" % (unique_id))

    if status:
        rest['status'] = status.strip()

    # getting input dictionary and appending
    if rest:
        # sorting the output
        for key in ('object', 'action', 'sub_action', 'status', 'reason'):
            if rest.has_key(key):
                output.append("%s=%s" % (key, unicode(rest[key]).strip()))
                del rest[key]

        for key in rest:
            output.append("%s=%s" % (unicode(key).strip(), unicode(rest[key]).strip()))

    ret = ",".join(map(unicode, output))
    return ret

def info(rest=None, user=None, status=None):

    if not isinstance(rest, dict):
        raise
    msg = logHelper(rest, user, status)
    logs.info(msg)

def crit(rest=None, user=None, status=None):

    if not isinstance(rest, dict):
        raise
    msg = logHelper(rest, user, status or rest.get('status') or 'failure')
    logs.critical(msg)

def error(rest=None, user=None, status=None):

    if not isinstance(rest, dict):
        raise
    msg = logHelper(rest, user, status or rest.get('status') or 'failure')
    logs.error(msg)

def warn(rest=None, user=None, status=None):

    if not isinstance(rest, dict):
        raise
    msg = logHelper(rest, user, status=None)
    logs.warn(msg)


def debug(rest=None, user=None, status=None):

    if isinstance(rest, str) or isinstance(rest, unicode):
        global logs
        if not logs:
            logs = logging.getLogger(DEFAULT_LOGGER)
        output = list()
        user, unique_id = _get_user()
        if user:
            output.append("user="+unicode(user))
        if unique_id:
            output.append("unique_id="+unicode(unique_id))
        msg = ",".join(map(unicode, output))
        msg = "%s,%s" % (msg, rest)
        logs.debug(msg)
    else:
        msg = logHelper(rest, user, status)
        logs.debug(msg)


def feature(feature, subfeature=None, text=None):

    global feature_logger

    # get the logger
    if not feature_logger:
        feature_logger = logging.getLogger(FEATURE_LOGGER)

    msg = 'feature=%s' % (feature)
    if subfeature:
        msg += ',subfeature=%s' % (subfeature)
    if text:
        msg += ',msg=%s' % (text)

    user, unique_id = _get_user()

    if user:
        msg += ',user=%s' % (user)
    if unique_id:
        msg += ',unique_id=%s' % (unique_id)

    feature_logger.info(msg)   # we are using another target to log into another file


