# -*- coding: utf-8 -*-
# (c) 2014-2015 Andreas Motl, <andreas@getkotori.org>
import sys
import traceback
from StringIO import StringIO

def traceback_get_exception(num = -1):

    # build error message
    exception_string = ''.join(traceback.format_exception_only(sys.exc_type, hasattr(sys, 'exc_value') and sys.exc_value or 'Unknown'))

    # extract error location from traceback
    if hasattr(sys, 'exc_traceback'):
        (filename, line_number, function_name, text) = traceback.extract_tb(sys.exc_traceback)[num]
    else:
        (filename, line_number, function_name, text) = ('-', '-', '-', '-')

    error = {
        'message': exception_string,
        'location': {
            'filename': filename,
            'line_number': line_number,
            'function_name': function_name,
            'text': text,
            }
    }

    return error

def format_exception_location(error, prefix=''):
    if prefix:
        prefix += "\n"
    error_location =\
    prefix +\
    "Filename:    %s\nLine number: %s\nFunction:    %s\nCode:        %s" %\
    (error['location']['filename'], error['location']['line_number'], error['location']['function_name'], error['location']['text'])
    return error_location


def last_error_and_traceback():
    error_entry = traceback_get_exception(0)
    error_last = traceback_get_exception(-1)
    sep = '-' * 60
    payload_location = "\n".join([sep, format_exception_location(error_entry, "Entry point:"), sep, format_exception_location(error_last, "Source of exception:")])
    payload = ''.join(["ERROR: ", error_entry['message'], "\n", payload_location, "\n"])

    # add full traceback
    buffer = StringIO()
    traceback.print_exc(file=buffer)
    buffer.seek(0)
    payload += '\n' + buffer.read()

    return payload