#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import (
    absolute_import,
    division,
    print_function,
)

# --------------------------------------------
import logging


class NullHandler(logging.Handler):
    def emit(self, record):
        pass


logger = logging.getLogger('pyagentx.updater')
logger.addHandler(NullHandler())
# --------------------------------------------

import time
import threading
try:
    import queue
except ImportError:
    import Queue as queue

import pyagentx


class Updater(threading.Thread):
    def agent_setup(self, queue, oid, freq):
        self.stop = threading.Event()
        self._queue = queue
        self._oid = oid
        self._freq = freq
        self._data = {}

    def run(self):
        start_time = 0
        while True:
            if self.stop.is_set(): break
            now = time.time()
            if now - start_time > self._freq:
                logger.info('Updating : %s (%s)' %
                            (self.__class__.__name__, self._oid))
                start_time = now
                self._data = {}
                try:
                    self.update()
                    self._queue.put_nowait({
                        'oid': self._oid,
                        'data': self._data
                    })
                except queue.Full:
                    logger.error('Queue full')
                except:
                    logger.exception('Unhandled update exception')
            time.sleep(0.1)
        logger.info('Updater stopping')

    # Override this
    def update(self):
        pass

    def set_INTEGER(self, oid, value):
        logger.debug('Setting INTEGER %s = %s' % (oid, value))
        self._data[oid] = {
            'name': oid,
            'type': pyagentx.TYPE_INTEGER,
            'value': value
        }

    def set_OCTETSTRING(self, oid, value):
        logger.debug('Setting OCTETSTRING %s = %s' % (oid, value))
        self._data[oid] = {
            'name': oid,
            'type': pyagentx.TYPE_OCTETSTRING,
            'value': value
        }

    def set_OBJECTIDENTIFIER(self, oid, value):
        logger.debug('Setting OBJECTIDENTIFIER %s = %s' % (oid, value))
        self._data[oid] = {
            'name': oid,
            'type': pyagentx.TYPE_OBJECTIDENTIFIER,
            'value': value
        }

    def set_IPADDRESS(self, oid, value):
        logger.debug('Setting IPADDRESS %s = %s' % (oid, value))
        self._data[oid] = {
            'name': oid,
            'type': pyagentx.TYPE_IPADDRESS,
            'value': value
        }

    def set_COUNTER32(self, oid, value):
        logger.debug('Setting COUNTER32 %s = %s' % (oid, value))
        self._data[oid] = {
            'name': oid,
            'type': pyagentx.TYPE_COUNTER32,
            'value': value
        }

    def set_GAUGE32(self, oid, value):
        logger.debug('Setting GAUGE32 %s = %s' % (oid, value))
        self._data[oid] = {
            'name': oid,
            'type': pyagentx.TYPE_GAUGE32,
            'value': value
        }

    def set_TIMETICKS(self, oid, value):
        logger.debug('Setting TIMETICKS %s = %s' % (oid, value))
        self._data[oid] = {
            'name': oid,
            'type': pyagentx.TYPE_TIMETICKS,
            'value': value
        }

    def set_OPAQUE(self, oid, value):
        logger.debug('Setting OPAQUE %s = %s' % (oid, value))
        self._data[oid] = {
            'name': oid,
            'type': pyagentx.TYPE_OPAQUE,
            'value': value
        }

    def set_COUNTER64(self, oid, value):
        logger.debug('Setting COUNTER64 %s = %s' % (oid, value))
        self._data[oid] = {
            'name': oid,
            'type': pyagentx.TYPE_COUNTER64,
            'value': value
        }