# standard imports
import logging

# external imports
from chainlib.connection import (
        RPCConnection,
        ConnType,
        )
from chainlib.eth.connection import EthUnixSignerConnection
from chainlib.chain import ChainSpec

logg = logging.getLogger(__name__)


class RPC:

    def __init__(self, chain_spec, rpc_provider, signer_provider=None):
        self.chain_spec = chain_spec
        self.rpc_provider = rpc_provider
        self.signer_provider = signer_provider


    def get_default(self):
        return RPCConnection.connect(self.chain_spec, 'default')


    @staticmethod
    def from_config(config):
        chain_spec = ChainSpec.from_chain_str(config.get('CHAIN_SPEC'))
        RPCConnection.register_location(config.get('RPC_HTTP_PROVIDER'), chain_spec, 'default')
        if config.get('SIGNER_PROVIDER'):
            RPCConnection.register_constructor(ConnType.UNIX, EthUnixSignerConnection, tag='signer')
            RPCConnection.register_location(config.get('SIGNER_PROVIDER'), chain_spec, 'signer')
        rpc = RPC(chain_spec, config.get('RPC_HTTP_PROVIDER'), signer_provider=config.get('SIGNER_PROVIDER'))
        logg.info('set up rpc: {}'.format(rpc))
        return rpc


    def __str__(self):
        return 'RPC factory, chain {}, rpc {}, signer {}'.format(self.chain_spec, self.rpc_provider, self.signer_provider)