# TODO: make the next two lines unnecessary
# pylint: disable=line-too-long
# pylint: disable=missing-docstring
import json
import logging
import os

from ..Aggregator import Plugin as AggregatorPlugin
from ..Monitoring import Plugin as MonitoringPlugin
from ..Telegraf import Plugin as TelegrafPlugin
from ...common.interfaces import AbstractPlugin, MonitoringDataListener, AggregateResultListener

logger = logging.getLogger(__name__)  # pylint: disable=C0103


class Plugin(AbstractPlugin, AggregateResultListener, MonitoringDataListener):
    # pylint:disable=R0902
    SECTION = 'json_report'

    def __init__(self, core):
        super(Plugin, self).__init__(core)
        self._is_telegraf = None

    def get_available_options(self):
        return ['monitoring_log', 'test_data_log', 'test_stats_log']

    def configure(self):
        self.monitoring_logger = self.create_file_logger('monitoring',
                                                         self.get_option('monitoring_log',
                                                                         'monitoring.log'))
        self.aggregator_data_logger = self.create_file_logger('aggregator_data',
                                                              self.get_option('test_data_log',
                                                                              'test_data.log'))
        self.core.job.subscribe_plugin(self)

    def create_file_logger(self, logger_name, file_name, formatter=None):
        loggr = logging.getLogger(logger_name)
        loggr.setLevel(logging.INFO)
        handler = logging.FileHandler(os.path.join(self.core.artifacts_dir, file_name), mode='w')
        handler.setLevel(logging.INFO)
        if formatter:
            handler.setFormatter(formatter)
        loggr.addHandler(handler)
        loggr.propagate = False
        return loggr

    def on_aggregated_data(self, data, stats):
        """
        @data: aggregated data
        @stats: stats about gun
        """
        self.aggregator_data_logger.info(json.dumps({'data': data, 'stats': stats}))

    def monitoring_data(self, data_list):
        if self.is_telegraf:
            self.monitoring_logger.info(json.dumps(data_list))
        else:
            [self.monitoring_logger.info(data.strip()) for data in data_list if data]

    @property
    def is_telegraf(self):
        if self._is_telegraf is None:
            self._is_telegraf = 'Telegraf' in self.core.job.monitoring_plugin.__module__
        return self._is_telegraf