# coding=utf-8

"""Functions to export Etherpad metrics."""

# Libs
import json
import requests


class EtherpadCollector(object):
    """
    EtherpadCollector.
    Collector for Etherpad stats.
    """

    def __init__(self, config):
        """
        Initialize an etherpad collector object.
        :param config: Configuration for Etherpad module (list of instances)
        """
        # Initialize list of instances based on configuration
        self.instances = []
        for instance in config:
            if 'url' not in instance or 'name' not in instance:
                print('Incorrect instance configuration\n')
                print(instance)
                print('"etherpad" key on configuration file should be a list of object with "url" and "name" attributes')
                continue
            else:
                if instance['url'].endswith('/'):
                    instance['url'] = instance['url'][:-1]
                self.instances.append(instance)

    def collect(self):
        """
        Get the analytics of etherpad instances and returns a list of InfluxDB points.
        :returns: List of InfluxDB formatted objects
        """
        metrics = []

        # Get all instances stats
        for instance in self.instances:
            data = self._get_stats(instance)
            if data is None:
                print('Unable to get stats from Etherpad instance : ' + instance['url'])
                continue
            # Create metrics
            metrics.append({
                'measurement': 'etherpad_pads_count',
                'tags': {
                    'name': instance['name']
                },
                'time': data['timestamp']*1000,
                'fields': {
                    'value': data['padsCount']
                }
            })
            metrics.append({
                'measurement': 'etherpad_blank_pads_count',
                'tags': {
                    'name': instance['name']
                },
                'time': data['timestamp']*1000,
                'fields': {
                    'value': data['blankPads']
                }
            })

        return metrics

    @classmethod
    def _get_stats(cls, instance):
        """
        Get stats for an Etherpad instance.
        :param instance: Configuration for Etherpad instance (dict with at least "url" key)
        :returns: JSON data returned by Etherpad stats module
        """
        # Send request
        res = requests.get(instance['url'] + "/stats.json")
        if res.status_code != 200:
            return None
        try:
            data = json.loads(res.text)
        except IOError as err:
            print(err)
            return None
        return data