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

import argparse
import json

import sys
import re
import os
import django
import ipaddress

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "dnmgmt.settings")
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_DIR)
django.setup()


from whoisdb.models import ASBlock, ASNumber, Contact, Maintainer, InetNum

__VERSION__ = '0.1'

def _parser():
	parser = argparse.ArgumentParser(
	             #prog='foo',
	             #description='do some awesome foo',
	)

	#parser.add_argument("-p", "--port", default=2323, type=int, help="Your port")
	#parser.add_argument("-v", "--verbose", default=False, action="store_true", help="Be more verbose")
	parser.add_argument("-j", "--json", type=argparse.FileType('r'), required=True, help="Path to json file")

	parser.add_argument("--version", action="version", version="%(prog)s " + __VERSION__)

	return parser

def main():
	parser = _parser()
	args = parser.parse_args()

	defContact = Contact.objects.get(handle="UNKNOWN-DN")
	defMnt = Maintainer.objects.get(handle="DARKNET-MNT")
	blocks = [
		ASBlock.objects.get(handle="TRA1-ASB"),
		ASBlock.objects.get(handle="UAB1-ASB")
	]
	ranges = [
		InetNum.objects.get(handle="TRA1-NET"),
		InetNum.objects.get(handle="DEF4-NET"),
		InetNum.objects.get(handle="DEF6-NET"),
		InetNum.objects.get(handle="MISC6-NET"),
		InetNum.objects.get(handle="LTRA1-NET"),
		InetNum.objects.get(handle="MAIN4-NET"),
	]


	data = json.load(args.json)
	print(data.keys())
	for k, v in data["handles"].items():
		print(k, v["person"])
	for asn in data["as"]:
		print(asn)
		if ASNumber.objects.filter(number=asn["number"]).count() > 0:
			continue

		obj = ASNumber(number=asn["number"])
		block = None
		for block in blocks:
			if obj.number >= block.asBegin and obj.number <= block.asEnd:
				obj.asblock = block
				break
		else:
			raise ValueError("AS %d does not fit a block" % asn["number"])

		if len(asn['admin_c']) >= 1:
			name = data["handles"][asn["admin_c"][0]]["person"]
			obj.name = "Imported AS of %s" % name
			obj.handle = ASNumber.genGenericHandle(re.sub("[^a-zA-Z0-9 ]", "", name))
		else:
			obj.name = "Imported AS without admin info"
			obj.handle = ASNumber.genGenericHandle("Unknown Imported AS")
		obj.description = "Object has been imported from old DB and has not yet been edited"
		obj.save()
		obj.mnt_by.add(defMnt)
		obj.admin_c.add(defContact)
		obj.save()

	for net in data["network"]:
		print(net)
		network = ipaddress.ip_network(net["prefix"])

		if InetNum.objects.filter(address=str(network.network_address), netmask=network.prefixlen).count() > 0:
			continue

		origin = None
		if net["origin"]:
			origin = ASNumber.objects.get(number=net["origin"])
		obj = InetNum(address=str(network.network_address), netmask=network.prefixlen)
		obj.protocol = InetNum.IPv4 if network.version == 4 else InetNum.IPv6

		x = list(filter(lambda _x: _x['number'] == net["origin"], data["as"]))
		if len(x) > 0 and x[0]["admin_c"]:
			name = data["handles"][x[0]["admin_c"][0]]["person"]
			obj.name = "Imported Network of %s" % name
			obj.handle = InetNum.genGenericHandle(re.sub("[^a-zA-Z0-9 ]", "", name))
		else:
			obj.name = "Imported Network without admin info"
			obj.handle = InetNum.genGenericHandle("Unknown Imported Network")
		obj.description = "Object has been imported from old DB and has not yet been edited"

		for r in ranges:
			if network.network_address in r.getNetwork():
				obj.parent_range = r
				break
		else:
			raise ValueError("%s did not fit in any netblock" % network)

		obj.save()

		obj.mnt_by.add(defMnt)
		obj.admin_c.add(defContact)
		if origin:
			obj.origin_as.add(origin)
		obj.save()

if __name__ == '__main__':
	main()