# coding=utf-8
import random
from urllib2 import HTTPError

from pyjsonrpc import HttpClient, JsonRpcError

from dubbo_client.rpcerror import NoProvider, ConnectionFail, dubbo_client_errors, InternalError


__author__ = 'caozupeng'


class DubboClient(object):
    interface = ''
    group = ''
    version = ''

    class _Method(object):

        def __init__(self, client_instance, method):
            self.client_instance = client_instance
            self.method = method

        def __call__(self, *args, **kwargs):
            return self.client_instance.call(self.method, *args, **kwargs)

    def __init__(self, interface, registry, **kwargs):
        self.interface = interface
        self.registry = registry
        self.group = kwargs.get('group', '')
        self.version = kwargs.get('version', '')
        self.registry.add_provider_listener(interface)

    def call(self, method, *args, **kwargs):
        provides = self.registry.get_provides(self.interface, {}, version=self.version, group=self.group)
        if len(provides) == 0:
            raise NoProvider('can not find provide', self.interface)
        ip_port, service_url = random.choice(provides.items())
        print service_url.location
        client = HttpClient(url="http://{0}{1}".format(ip_port, service_url.path))
        try:
            return client.call(method, *args, **kwargs)
        except HTTPError, e:
            raise ConnectionFail(None, e.filename)
        except JsonRpcError, error:
            raise dubbo_client_errors.get(error.code, None)
        except Exception, ue:
            raise InternalError(ue.message, None)

    def __call__(self, method, *args, **kwargs):
        """
        Redirects the direct call to *self.call*
        """
        return self.call(method, *args, **kwargs)

    def __getattr__(self, method):
        """
        Allows the usage of attributes as *method* names.
        """
        return self._Method(client_instance=self, method=method)


if __name__ == '__main__':
    pass