#!/usr/bin/env python
#
# Copyright 2016 the original author or authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
from constants import Constants as C

class Capabilities:

    def __init__(self):
        self.server_caps = self._get_server_capabilities()
        self.client_caps = set()

    def add_client_capability(self, cap):
        self.client_caps.add(cap)

    #TODO:  This will be automatically generated from the voltha proto files
    def _get_server_capabilities(self):
        return (
            C.NETCONF_BASE_10,
            C.NETCONF_BASE_11,
            "urn:opencord:params:xml:ns:voltha:ietf-voltha",
            "urn:opencord:params:xml:ns:voltha:ietf-openflow_13",
            "urn:opencord:params:xml:ns:voltha:ietf-meta",
            "urn:opencord:params:xml:ns:voltha:ietf-logical_device",
            "urn:opencord:params:xml:ns:voltha:ietf-health",
            "urn:opencord:params:xml:ns:voltha:ietf-device",
            "urn:opencord:params:xml:ns:voltha:ietf-empty",
            "urn:opencord:params:xml:ns:voltha:ietf-common",
            "urn:opencord:params:xml:ns:voltha:ietf-any",
            "urn:opencord:params:xml:ns:voltha:ietf-adapter"
        )

    #TODO:  A schema exchange will also need to happen

    description = """

    Option 1:  Client already have the yang model for voltha and adapters:
        <hello xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
            <capabilities>
                <capability>
                    urn:ietf:params:netconf:base:1.1
                </capability>
                <capability>
                    urn:cord:voltha:1.0
                </capability>
                <capability>
                    urn:cord:voltha:adpater_x:1.0
                </capability>


    Option 2: NETCONF-MONITORING - schema exchanges

        server expose capabilities

            <hello xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
                <capabilities>
                    <capability>
                        urn:ietf:params:netconf:base:1.1
                    </capability>
                    <capability>
                        urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring?module=ietf-netconf-monitoring&revision=2010-10-04
                    </capability>

        client request schemas

            <rpc message-id="101"
                 xmlns="urn:ietf:params:xml:ns:netconf:base:1.1">
                <get>
                    <filter type="subtree">
                        <netconf-state xmlns=
                            "urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring">
                             <schemas/>
                        </netconf-state>
                    </filter>
                </get>
            </rpc>

        server sends back schemas

            <rpc-reply message-id="101"
                       xmlns="urn:ietf:params:xml:ns:netconf:base:1.1">
                  <data>
                        <netconf-state
                            xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring">
                            <schemas>
                                <schema>
                                    <identifier>voltha</identifier>
                                    <version>1.0</version>
                                    <format>yang</format>
                                    <namespace>urn:cord:voltha</namespace>
                                    <location>NETCONF</location>
                                </schema>
                                <schema>
                                    <identifier>adapter_x</identifier>
                                    <version>x_release</version>
                                    <format>yang</format>
                                    <namespace>urn:cord:voltha:adapter_x</namespace>
                                    <location>NETCONF</location>
                                </schema>
                            </schemas>
                        </netconf-state>
                  </data>
            </rpc-reply>


        client requests each schema instance

            <rpc message-id="102"
                xmlns="urn:ietf:params:xml:ns:netconf:base:1.1">
                <get-schema
                    xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring">
                    <identifer>voltha</identifer>
                    <version>1.0</version>
                </get-schema>
             </rpc>

             <rpc-reply message-id="102"
                xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
                <data
                    xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring">
                    module voltha {
                        //default format (yang) returned
                        //voltha version 0.1 yang module
                        //contents here ...
                    }
                </data>
             </rpc-reply>


    GETTING DATA

    Use filter:
        1) namespace filter
            <filter type="subtree">
                <top xmlns="http://example.com/schema/1.2/config"/>
            </filter>

         2) <filter type="subtree">
                <adapters xmlns="urn:cord:voltha:adapter_x">
                    <adapter>
                        <id>uuid</id>
                        <config/>
                    </adapter>
                </adapters>
            </filter>

            /voltha/adapters/<adapter>/[<id>, <vendor>, <version>, <config>, <additonal_desc>]

    """