import json
import time
import urllib.request

__document = None
__data = {}
__next = 0

__sources = [
        {
            'url': 'http://free.ipwhois.io/json/',
            'mapping': {
                'latitude': 'latitude',
                'longitude': 'longitude',
                'country': 'country',
                'ip': 'public_ip',
            }
        },
        {
            'url': 'http://ipapi.co/json',
            'mapping': {
                'latitude': 'latitude',
                'longitude': 'longitude',
                'country_name': 'country',
                'ip': 'public_ip',
            }
        }
]

def __expired():
    global __next
    return __next <= time.time()

def __load():
    global __data
    global __next

    __data = {}
    for src in __sources:
        try:
            tmp = json.loads(urllib.request.urlopen(src['url']).read())
            for k, v in src['mapping'].items():
                __data[v] = tmp.get(k, None)
            __next = time.time() + 60*60*12 # update once every 12h
            return
        except Exception as e:
            pass
    __next = time.time() + 60*30 # error - try again every 30m

def __get(name, default=None):
    global __data
    if not __data or __expired():
        __load()
    return __data.get(name, default)

def reset():
    global __next
    __next = 0

def coordinates():
    return __get('latitude'), __get('longitude')

def country():
    return __get('country')

def public_ip():
    return __get('public_ip')

# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4