"""Defines the used Result object based on the current versions and/or features available to Python runtime

Additionally, defines any custom result objects that may be used to enable more Pythonic interaction with endpoints.
"""
import sys
from itertools import chain

major, minor, patch = sys.version_info[:3]

try: # pragma: no cover
    from collections import OrderedDict
except ImportError: # pragma: no cover
    from ordereddict import OrderedDict

if major >= 3: # pragma: no cover
    from itertools import zip_longest
else: # pragma: no cover
    from itertools import izip_longest as zip_longest

if major >= 3 and (minor > 5 or (minor == 5 and patch >= 3)):
    from domaintools_async import AsyncResults as Results
else: # pragma: no cover
    from domaintools.base_results import Results


class Reputation(Results):
    """Returns the reputation results in a format that can quickly be converted into floats / ints"""

    def __float__(self):
        return float(self['risk_score'])

    def __int__(self):
        return int(self['risk_score'])


class GroupedIterable(Results):
    """Returns a results item in a format that allows for grouped iteration of mulpitle result lists"""

    def _items(self):
        if self._items_list is None:
            self._items_list = chain(*[zip_longest([], value, fillvalue=key) for key, value in self.response().items()
                                       if type(value) in (list, tuple)])

        return self._items_list


class ParsedWhois(Results):
    """Returns the parsed whois results in a format that can quickly be flattened"""

    def flattened(self):
        """Returns a flattened version of the parsed whois data"""
        parsed = self['parsed_whois']
        flat = OrderedDict()
        for key in ('domain', 'created_date', 'updated_date', 'expired_date', 'statuses', 'name_servers'):
            value = parsed[key]
            flat[key] = ' | '.join(value) if type(value) in (list, tuple) else value

        registrar = parsed.get('registrar', {})
        for key in ('name', 'abuse_contact_phone', 'abuse_contact_email', 'iana_id', 'url', 'whois_server'):
            flat['registrar_{0}'.format(key)] = registrar[key]

        for contact_type in ('registrant', 'admin', 'tech', 'billing'):
            contact = parsed.get('contacts', {}).get(contact_type, {})
            for key in ('name', 'email', 'org', 'street', 'city', 'state', 'postal', 'country', 'phone', 'fax'):
                value = contact[key]
                flat['{0}_{1}'.format(contact_type, key)] = ' '.join(value) if type(value) in (list, tuple) else value

        return flat