#!/usr/bin/env python
import json
import os
import sys
from json import JSONEncoder

import logging
from raiden.log_config import configure_logging
from logstash import LogstashFormatterVersion1, UDPLogstashHandler

from raiden.utils import echo_node


"""
Echo node entrypoint script that injects the logstash handler.
"""


class REPRJSONEncoder(JSONEncoder):
    def default(self, o):
        return repr(o)


class NotCrashingLogstashFormatter(LogstashFormatterVersion1):
    @classmethod
    def serialize(cls, message):
        if sys.version_info < (3, 0):
            return json.dumps(message, cls=REPRJSONEncoder)
        else:
            return bytes(json.dumps(message, cls=REPRJSONEncoder), 'utf-8')

    def get_extra_fields(self, record):
        fields = super().get_extra_fields(record)
        if 'original_msg' in fields and record.args:
            fields['original_msg'] = fields['original_msg'] % record.args
        return fields


class NotCrashingUDPLogstashHandler(UDPLogstashHandler):
    def __init__(self, host, port=5959, message_type='logstash', tags=None, fqdn=False, version=0):
        super().__init__(host, port, message_type, tags, fqdn, version)
        if version == 1:
            self.formatter = NotCrashingLogstashFormatter(message_type, tags, fqdn)
        else:
            raise RuntimeError("Not supported")


if __name__ == "__main__":
    if 'RAIDEN_LOGSTASH_HOST' in os.environ:
        configure_logging({'': 'WARN'}, colorize=False)
        logging.root.addHandler(
            NotCrashingUDPLogstashHandler(
                os.environ.get('RAIDEN_LOGSTASH_HOST'),
                int(os.environ.get('RAIDEN_LOGSTASH_PORT', 9595)),
                version=1
            )
        )

    sys.exit(
        echo_node.runner()
    )
