#!/usr/bin/python3

from jsonschema import validate

schema = {
    "$schema": "http://json-schema.org/schema#",
    "description": "Schema for border router information",
    "title": "Border Router Information",
    "type": "object",
    "properties": {
        "information": {
            "type": "object",
            "oneOf": [
                { "$ref": "#/definitions/interface_configuration" },
                { "$ref": "#/definitions/rpl_configuration" },
                { "$ref": "#/definitions/neighbors" },
                { "$ref": "#/definitions/routes" },
                { "$ref": "#/definitions/topology" }
            ]
        }
    },

    "definitions": {
        "interface_configuration": {
            "title": "Network Interface Configuration options",
            "type": "array",
            "items": {
	        "type": "object",
                "items" : {
                    "type": "array",
                    "values": {
                        "oneOf": [
                            { "$ref": "#/unicast/ipv6" },
                            { "$ref": "#/unicast/ipv4" },
                            { "$ref": "#/multicast/mcast_ipv6" },
                            { "$ref": "#/multicast/mcast_ipv4" }
                        ]
                    }
                }
            }
        },

        "rpl_configuration": {
            "title": "RPL Configuration options",
            "type": "array",
            "items": {
	        "type": "object",
                "items" : {
                    "RPL mode" : "string",
                    "Objective function" : "string",
                    "Routing metric" : "string",
                    "Mode of operation" : "string",
                    "Send probes to nodes" : "string",
                    "Max instances" : "string",
                    "Max DAG / instance" : "string",
                    "Min hop rank increment" : "string",
                    "Initial link metric" : "string",
                    "RPL preference value" : "string",
                    "DAG grounded by default" : "string",
                    "Default instance id" : "string",
                    "Insert hop-by-hop option" : "string",
                    "Specify DAG when sending DAO" : "string",
                    "DIO min interval" : "string",
                    "DIO doublings interval" : "string",
                    "DIO redundancy value" : "string",
                    "DAO send timer" : "string",
                    "DAO max retransmissions" : "string",
                    "DAO ack expected" : "string",
                    "DIS send periodically" : "string",
                    "DIS interval" : "string",
                    "Default route lifetime unit" : "string",
                    "Default route lifetime" : "string",
                    "Multicast MOP3 route lifetime" : "string"
                }
            }
        },

        "neighbors": {
            "title": "Neighbor information",
            "type": "array",
	    "items": {
	        "type": "object",
                "items" : {
                    "Operation" : "string",
	            "IPv6 address": "string",
	            "Link address": "string",
	            "Is router": "string",
	            "Link metric": "string",
	        }
            }
        },

        "routes": {
            "title": "Network routes",
            "type": "array",
            "items": {
	        "type": "object",
                "items" : {
                    "Operation" : "string",
                    "IPv6 prefix": "string",
                    "IPv6 address": "string",
                    "Link address": "string"
                }
            }
        },

        "topology": {
            "type": "object",
            "properties": {
                "nodes": {
                    "type": "array",
                    "items": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "integer"
                             },
                            "label": {
                                "type": "string"
                            },
                            "title": {
                                "type": "string"
                            }
                        }
                    }
                },
                "edges": {
                    "type": "array",
                    "items": {
                        "type": "object",
                        "properties": {
                            "from": {
                                "type": "integer"
                            },
                            "to": {
                                "type": "integer"
                            }
                        }
                    }
                }
            }
        }
    },

    "unicast": {
        "ipv6": {
            "title": "IPv6 addresses",
            "type": "array",
            "items": {
                "state": "string",
                "type": "string",
                "lifetime": "string"
            }
        },

        "ipv4": {
            "title": "IPv4 addresses",
            "type": "array",
            "items": {
                "state": "string",
                "type": "string",
                "lifetime": "string"
            }
        }
    },

    "multicast": {
        "mcast_ipv6": {
            "title": "IPv6 addresses",
            "type": "array",
            "items": {
                "address": "string"
            }
        },

        "mcast_ipv4": {
            "title": "IPv4 addresses",
            "type": "array",
            "items": {
                "value": "string"
            }
        }
    }
}

validate(
    {
        "interface_configuration": [
            {
                "0x20009000": [
                    {
                        "Type" : "Ethernet"
                    },
                    {
                        "Link address" : "00:04:9F:2A:00:01"
                    },
                    {
                        "MTU" : "1500"
                    },
                    {
                        "IPv6" : [
                            {
                                "fe80::204:9fff:fe2a:1" : {
                                    "state": "preferred",
                                    "type": "autoconf",
                                    "lifetime": "infinite"
                                }
                            },
                            {
                                "2001:db8::1" : {
                                    "state": "preferred",
                                    "type": "manual",
                                    "lifetime": "infinite"
                                }
                            },
                        ]
                    },
                    {
                        "IPv4" : [
                            {
                                "192.0.2.1" : {
                                    "state": "preferred",
                                    "type": "autoconf",
                                    "lifetime": "infinite"
                                }
                            }
                        ]
                    },
                    {
                        "IPv6 multicast" :
                        [
                            "ff02::1",
                            "ff02::1:ff2a:1",
                            "ff02::1:ff00:1"
                        ]
                    },
                    {
                        "IPv4 multicast" :
                        [
                            "224.0.0.251"
                        ]
                    },
                    {
                        "IPv4 gateway" : "0.0.0.0"
                    },
                    {
                        "IPv4 netmask" : "255.255.255.0"
                    },
                ]
            },
            {
                "0x20009a30": [
                    { "Type" : "IEEE 802.15.4" }
                ]
            }
        ],

        "neighbors": [
            {
                "0x20009000": [
                    {
                        "IPv6 address": "2001:db8::1",
                        "Link address": "00:11:22:33:44:55:66:77",
	                "Is router": "true",
	                "Link metric": "0"
                    },
                    {
                        "IPv6 address": "2001:db8::2",
                        "Link address": "77:11:22:33:44:55:66:00",
	                "Is router": "false",
	                "Link metric": "1"
                    },
                    {
                        "Operation" : "delete",
                        "IPv6 address": "2001:db8::3"
                    }
                ]
            },
            {
                "0x20009a30": []
            }
        ],

        "rpl_configuration": [
            { "RPL mode" : "mesh" },
            { "Objective function" : "MRHOF" },
            { "Routing metric" : "none" },
            { "Mode of operation" : "MOP2" },
            { "Send probes to nodes" : "false" },
            { "Max instances" : "1" },
            { "Max DAG / instance" : "2" },
            { "Min hop rank increment" : "256" },
            { "Initial link metric" : "2" },
            { "RPL preference value" : "0" },
            { "DAG grounded by default" : "false" },
            { "Default instance id" : "42" },
            { "Insert hop-by-hop option" : "true" },
            { "Specify DAG when sending DAO" : "true" },
            { "DIO min interval" : "12" },
            { "DIO doublings interval" : "8" },
            { "DIO redundancy value" : "10" },
            { "DAO send timer" : "4" },
            { "DAO max retransmissions" : "4" },
            { "DAO ack expected" : "true" },
            { "DIS send periodically" : "true" },
            { "DIS interval" : "60" },
            { "Default route lifetime unit" : "65535" },
            { "Default route lifetime" : "255" },
            { "Multicast MOP3 route lifetime" : "0" }
        ],

        "routes": [
            {
                "0x20009000": [
                    {
                        "IPv6 prefix" : "fde3:2cda:3eea:4d14:212:4b00:0:2/128",
                        "IPv6 address" : "fe80::212:4b00:0:2",
                        "Link address" : "00:12:4B:00:00:00:00:02"
                    },
                    {
                        "Operation" : "delete",
                        "IPv6 prefix" : "fde3:2cda:3eea:4d14:212:4b00:0:3/128"
                    }

                ]
            },
            {
                "0x20009a30": [
                ]
            }
        ],

        "topology" : {
            "nodes": [
                {
                    "id": 1,
                    "label": "N1",
                    "title": "Node 1"
                },
                {
                    "id": 2,
                    "label": "N2",
                    "title": "Node 2"
                }
                ],
            "edges": [
                {
                    "from": 1,
                    "to": 2
                }
                ]
            }