#!/usr/bin/env python3
#
# Copyright 2016 - The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import inspect
import os


class TraceLogger(object):

    def __init__(self, logger):
        self._logger = logger

    @staticmethod
    def _get_trace_info(level=1, offset=2):
        # We want the stack frame above this and above the error/warning/info
        inspect_stack = inspect.stack()
        trace_info = ''
        for i in range(level):
            try:
                stack_frames = inspect_stack[offset + i]
                info = inspect.getframeinfo(stack_frames[0])
                trace_info = '%s[%s:%s:%s]' % (trace_info, os.path.basename(info.filename), info.function, info.lineno)
            except IndexError:
                break
        return trace_info

    def _log_with(self, logging_lambda, trace_level, msg, *args, **kwargs):
        trace_info = TraceLogger._get_trace_info(level=trace_level, offset=3)
        logging_lambda('%s %s' % (msg, trace_info), *args, **kwargs)

    def exception(self, msg, *args, **kwargs):
        self._log_with(self._logger.exception, 5, msg, *args, **kwargs)

    def debug(self, msg, *args, **kwargs):
        self._log_with(self._logger.debug, 3, msg, *args, **kwargs)

    def error(self, msg, *args, **kwargs):
        self._log_with(self._logger.error, 3, msg, *args, **kwargs)

    def warn(self, msg, *args, **kwargs):
        self._log_with(self._logger.warn, 3, msg, *args, **kwargs)

    def warning(self, msg, *args, **kwargs):
        self._log_with(self._logger.warning, 3, msg, *args, **kwargs)

    def info(self, msg, *args, **kwargs):
        self._log_with(self._logger.info, 1, msg, *args, **kwargs)

    def __getattr__(self, name):
        return getattr(self._logger, name)
