import logging

from flask import current_app
from flask import _app_ctx_stack as stack
import grpc


logger = logging.getLogger(__name__)


class Channel:
    def __init__(self, app, address):
        self.app = app
        self.address = address
        self.stubs = {}
        app.teardown_appcontext(self.teardown)

    def _connect(self):
        logger.info("Connecting to {}...".format(self.address))
        return grpc.insecure_channel(self.address)

    @property
    def conn(self):
        ctx = stack.top
        if ctx is not None:
            if not hasattr(ctx, 'conn'):
                ctx.conn = self._connect()
            return ctx.conn

    def stub(self, stub):
        if stub not in self.stubs:
            self.stubs[stub] = stub(self.conn)
        return self.stubs[stub]

    def teardown(self, exception):
        ctx = stack.top
        if hasattr(ctx, 'conn'):
            del ctx.conn
