import json
import jsonschema

DEFAULT_REQUEST_HEADERS = {
    "Content-type": "application/json",
    "Accept": ["application/json"]
}

LOCATIONS_DEFINITIONS = {
    "location-endpoint": {
        "type": "object",
        "properties": {
            "equipment": {"type": "string"},
            "name": {"type": "string"},
            "abbreviation": {"type": "string"}
        },
        "required": ["equipment", "name", "abbreviation"],
        "additionalProperties": False
    },
    "location": {
        "type": "object",
        "properties": {
            "a": {"$ref": "#/definitions/location-endpoint"},
            "b": {"$ref": "#/definitions/location-endpoint"}
        },
        "required": ["a"],
        "additionalProperties": False
    },
    "locations-list": {
        "type": "array",
        "items": {"$ref": "#/definitions/location"}
    }
}

INFINERA_LINK_METADATA_DEFINITIONS = {
    "service-info": {
        "type": "object",
        "properties": {
            "id": {"type": "integer"},
            "name": {"type": "string"},
            "status": {
                "type": "string",
                "enum": ["operational", "installed", "planned", "ordered"]
            },
            "circuit_type": {
                "type": "string",
                "enum": ["path", "service", "l2circuit"]
            },
            "service_type": {"type": "string"},
            "project": {"type": "string"},
            "pop_name": {"type": "string"},
            "pop_abbreviation": {"type": "string"},
            "other_end_pop_name": {"type": "string"},
            "other_end_pop_abbreviation": {"type": "string"},
            "equipment": {"type": "string"},
            "other_end_equipment": {"type": "string"},
            "port": {"type": "string"},
            "other_end_port": {"type": "string"},
            "logical_unit": {
                "oneOf": [
                    {"type": "integer"},
                    {"type": "string", "maxLength": 0}
                ]
            },
            "other_end_logical_unit": {
                "oneOf": [
                    {"type": "integer"},
                    {"type": "string", "maxLength": 0}
                ]
            },
            "manufacturer": {
                "type": "string",
                "enum": ["juniper", "coriant", "infinera",
                         "cisco", "hewlett packard",
                         "corsa", "graham smith uk ltd",
                         "unknown", ""]
            },
            "card_id": {"type": "string"},
            "other_end_card_id": {"type": "string"},
            "interface_name": {"type": "string"},
            "other_end_interface_name": {"type": "string"}
        },
        "additionalProperties": False
    },
    "geant-lambda": {
        "type": "object",
        "properties": {
            "id": {"type": "integer"},
            "name": {"type": "string"},
            "project": {"type": "string"},
            "status": {
                "type": "string",
                "enum": ["operational", "installed", "planned", "ordered"]
            },
        },
        "additionalProperties": False
    }
}

INFINERA_LINK_METADATA = {
    "$schema": "http://json-schema.org/draft-07/schema#",
    "type": "object",

    "definitions": {
        **INFINERA_LINK_METADATA_DEFINITIONS, **LOCATIONS_DEFINITIONS
    },

    "type": "object",
    "properties": {
        "services": {
            "type": "array",
            "items": {"$ref": "#/definitions/service-info"}
        },
        "related-services": {
            "type": "array",
            "items": {"$ref": "#/definitions/service-info"}
        },
        "geant-lambda": {
            "$ref": "#/definitions/geant-lambda"
        },
        "locations": {"$ref": "#/definitions/locations-list"}
    },
    "additionalProperties": False
}


def test_trap_metadata(client):
    rv = client.get(
        '/classifier/infinera-lambda-info/'
        'LON2-DTNX10-1/1-A-2-1-4/gen-lon3_LHC_CERN-JANET_09013',
        headers=DEFAULT_REQUEST_HEADERS)
    assert rv.status_code == 200
    assert rv.is_json
    response_data = json.loads(rv.data.decode('utf-8'))
    jsonschema.validate(response_data, INFINERA_LINK_METADATA)