#!/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.sethandler')
logger.addHandler(NullHandler())
# --------------------------------------------


class SetHandlerError(Exception):
    pass


class SetHandler(object):
    def __init__(self):
        self.transactions = {}

    def network_test(self, session_id, transaction_id, oid, data):
        tid = "%s_%s" % (session_id, transaction_id)
        if tid in self.transactions:
            del (self.transactions[tid])
        try:
            self.test(oid, data)
            self.transactions[tid] = oid, data
        except SetHandler as e:
            logger.error('TestSet failed')
            raise e

    def network_commit(self, session_id, transaction_id):
        tid = "%s_%s" % (session_id, transaction_id)
        try:
            oid, data = self.transactions[tid]
            self.commit(oid, data)
            if tid in self.transactions:
                del (self.transactions[tid])
        except:
            logger.error('CommitSet failed')

    def network_undo(self, session_id, transaction_id):
        tid = "%s_%s" % (session_id, transaction_id)
        if tid in self.transactions:
            del (self.transactions[tid])

    def network_cleanup(self, session_id, transaction_id):
        tid = "%s_%s" % (session_id, transaction_id)
        if tid in self.transactions:
            del (self.transactions[tid])

    # User override these
    def test(self, oid, data):
        pass

    def commit(self, oid, data):
        pass