#!/usr/bin/env python3

# Created by @nyuszika7h
# Inspired by code by @myano

import collections
import json
import re
import socket

import saxo

url = 'http://freegeoip.net/json/{0}'
separator = ' | '
ip_re = r'(?:\d{1,3}\.){3}\d{1,3}$'


@saxo.pipe
def geoip(arg):
    page = saxo.request(url.format(arg))

    try:
        data = json.loads(page['text'])
    except ValueError:
        return 'freegeoip.net said: {0}'.format(page['text'])

    info = []

    attrs = collections.OrderedDict([
        ('ip', 'IP'),
        ('city', 'City'),
        ('region_name', 'State'),
        ('country_name', 'Country'),
        ('zipcode', 'ZIP'),
        ('latitude', 'Latitude'),
        ('longitude', 'Longitude')
    ])

    for key, name in attrs.items():
        if key == 'ip' and re.match(ip_re, arg):
            try: hostname = socket.gethostbyaddr(arg)[0]
            except socket.error:
                pass
            else:
                info.append('Hostname: {0}'.format(hostname))
        elif key in data and data[key]:
            info.append('{0}: {1}'.format(name, data[key]))

    return separator.join(info)
