#!/usr/bin/python2.5

from __future__ import with_statement

from pysqlite2 import dbapi2 as sqlite3
import sys

hlr = sqlite3.connect(sys.argv[1])
web = sqlite3.connect(sys.argv[2])

# switch to autocommit
hlr.isolation_level = None
web.isolation_level = None

hlr.row_factory = sqlite3.Row
web.row_factory = sqlite3.Row

with hlr:
	hlr_subscrs = hlr.execute("""
		SELECT * FROM Subscriber
	""").fetchall()
	hlr_tokens = hlr.execute("""
		SELECT * FROM AuthToken
	""").fetchall()

with web:
	web_tokens = web.execute("""
		SELECT * FROM reg_tokens
	""").fetchall()

# index by subscr id
hlr_subscrs_by_id = {}
hlr_tokens_by_subscr_id = {}
for x in hlr_subscrs:
	hlr_subscrs_by_id[x['id']] = x
del hlr_subscrs
for x in hlr_tokens:
	hlr_tokens_by_subscr_id[x['subscriber_id']] = x
del hlr_tokens

web_tokens_by_subscr_id = {}
for x in web_tokens:
	web_tokens_by_subscr_id[x['subscriber_id']] = x
del web_tokens

# remove leftover web_tokens and correct inconsistent fields
with web:
	for x in web_tokens_by_subscr_id.values():
		subscr = hlr_subscrs_by_id.get(x['subscriber_id'], None)
		if subscr is None:
			web.execute("""
				      DELETE FROM reg_tokens WHERE subscriber_id = ?
				   """, (x['subscriber_id'],))
			del web_tokens_by_subscr_id[x['subscriber_id']]
			continue
		if str(x['imsi']) != str(subscr['imsi']) or \
		   x['extension'] != subscr['extension'] or \
		   x['tmsi'] != subscr['tmsi'] or \
		   x['lac'] != subscr['lac']:
			web.execute("""
				      UPDATE reg_tokens
				      SET imsi = ?, extension = ?, tmsi = ?, lac = ?
				      WHERE subscriber_id = ?
				   """, (str(subscr['imsi']), subscr['extension'],
				   subscr['tmsi'], subscr['lac'], x['subscriber_id']))

# add missing web_tokens
with web:
	for x in hlr_tokens_by_subscr_id.values():
		subscr = hlr_subscrs_by_id.get(x['subscriber_id'], None)
		if subscr is None:
			hlr.execute("""
				      DELETE FROM AuthToken WHERE subscriber_id = ?
				   """, (x['subscriber_id'],))
			del hlr_tokens_by_subscr_id[x['subscriber_id']]
			continue
		webtoken = web_tokens_by_subscr_id.get(x['subscriber_id'], None)
		if webtoken is None:
			web.execute("""
				      INSERT INTO reg_tokens
				      (subscriber_id, extension, reg_completed, name, email, lac, imsi, token, tmsi)
				      VALUES
				      (?, ?, 0, ?, '', ?, ?, ?, ?)
				   """, (x['subscriber_id'], subscr['extension'], subscr['name'],
				   subscr['lac'], str(subscr['imsi']), x['token'], subscr['tmsi']))

# authorize subscribers
with hlr:
	for x in web_tokens_by_subscr_id.values():
		subscr = hlr_subscrs_by_id.get(x['subscriber_id'], None)
		if x['reg_completed'] and not subscr['authorized']:
			hlr.execute("""
				      UPDATE Subscriber
				      SET authorized = 1
				      WHERE id = ?
				   """, (x['subscriber_id'],))

hlr.close()
web.close()

