#!/usr/bin/env python
# -*- coding: utf-8 -*-

from urllib import urlencode
from simplejson import loads
import urllib2
import datetime
import time

def get_json(method, **kw):
    kw['tg_format'] = 'json'
    url = 'http://6pp.kvdb.net/services/' + method + "?%s" % urlencode(kw)
    print "Calling: %s" % url
    response = urllib2.urlopen(url).read()
    response = loads(response)
    if response.has_key("result"):
        return response["result"]
    else:
        raise("faulcode %s" % response)
        return response

def sync_with_6pp(timestamp=0):
    # Get all cities from 6PP that were created/updated after <timestamp>
    # You can't load all cities at once. Use pagination.
    current_page = pages = 1
    while current_page <= pages:
        response = get_json("getcity", page=current_page, min_update_date=timestamp)
        pages = response['pages']
        for city in response['cities']:
            # Now insert this city into your database
            print "New city: %s" % city['official_name']
        current_page += 1

    # Get all postcodes from 6PP that were created/updated after <timestamp>
    current_page = pages = 1
    while current_page <= pages:
        response = get_json("getpostcode", page=current_page, min_update_date=timestamp)
        pages = response['pages']
        for postcode in response['postcodes']:
            print "New postcode: %s (%s)" % (postcode['fourpp'], postcode['city_name'])
        current_page += 1

    # Get all streets from 6PP that were created/updated after <timestamp>
    current_page = pages = 1
    while current_page <= pages:
        response = get_json("getstreet", page=current_page, min_update_date=timestamp)
        pages = response['pages']
        for street in response['streets']:
            print "New street: %s (%s)" % (street['street'], street['city_name'])
        current_page += 1

# Sync with 6PP from scratch. All known entries known until now will be loaded.
sync_with_6pp()

now_ts = int(time.mktime(datetime.datetime.now().timetuple()))
soon_ts = int(time.mktime(datetime.datetime.now().timetuple())) + 100

# Sync with 6PP, but only entries updated/created after <now_ts>
sync_with_6pp(now_ts)

