#!/usr/bin/env python3

from tapi_server.models.tapi_common_context import TapiCommonContext
from tapi_server.models.tapi_connectivity_cep_list import TapiConnectivityCepList
from tapi_server.models.tapi_connectivity_connectivity_context import TapiConnectivityConnectivityContext

context = TapiCommonContext()

def service_interface_point_list ():
    """Retrieve all ServiceInterfacePoints

    :rtype: List(ServiceInterfacePoint)
    """
    return context.service_interface_point
       

def service_interface_point (sip_uuid):
    """Retrieve ServiceInterfacePoint by ID

    :param sip_uuid: ID of ServiceInterfacePoint
    :type sip_uuid: str

    :rtype: ServiceInterfacePoint
    """
    for sip in context.service_interface_point:
        if sip.uuid == sip_uuid:
            return sip


def topology_list ():
    """Retrieve all Topology

    :rtype: List(Topology)
    """
    return context.topology_context.topology


def topology (topo_uuid):
    """Retrieve Topology by ID

    :param topo_uuid: ID of Topology
    :type topo_uuid: str

    :rtype: Topology
    """
    for topo in context.topology_context.topology:
        if topo.uuid == topo_uuid:
            return topo


def node (topo_uuid, node_uuid):
    """Retrieve Node by ID

    :param topo_uuid: ID of Topology
    :type topo_uuid: str
    :param node_uuid: ID of Node
    :type node_uuid: str

    :rtype: Node
    """
    for topo in context.topology_context.topology:
        if topo.uuid == topo_uuid:
            for node in topo.node:
                if node.uuid == node_uuid:
                    return node
       

def link (topo_uuid, link_uuid):
    """Retrieve Link by ID

    :param topo_uuid: ID of Topology
    :type topo_uuid: str
    :param link_uuid: ID of Link
    :type link_uuid: str

    :rtype: Link
    """
    for topo in context.topology_context.topology:
        if topo.uuid == topo_uuid:
            for link in topo.link:
                if link.uuid == link_uuid:
                    return link
       

def node_edge_point (topo_uuid, node_uuid, nep_uuid):
    """Retrieve NodeEdgePoint by ID

    :param topo_uuid: ID of Topology
    :type uuid: str
    :param node_uuid: ID of Node
    :type node_uuid: str
    :param nep_uuid: ID of NodeEdgePoint
    :type nep_uuid: str

    :rtype: NodeEdgePoint
    """
    for topo in context.topology_context.topology:
        if topo.uuid == topo_uuid:
            for node in topo.node:
                if node.uuid == node_uuid:
                    for nep in node.owned_node_edge_point:
                        if nep.uuid == nep_uuid:
                            return nep
                        
def connection_end_point_list (topo_uuid, node_uuid, nep_uuid):
    """Retrieve NodeEdgePoint by ID

    :param topo_uuid: ID of Topology
    :type uuid: str
    :param node_uuid: ID of Node
    :type node_uuid: str
    :param nep_uuid: ID of NodeEdgePoint
    :type nep_uuid: str

    :rtype: List[ConnectionEndPoint]
    """
    for topo in context.topology_context.topology:
        if topo.uuid == topo_uuid:
            for node in topo.node:
                if node.uuid == node_uuid:
                    for nep in node.owned_node_edge_point:
                        if nep.uuid == nep_uuid:
                            if not hasattr(nep, "cep_list"):
                                nep.cep_list = TapiConnectivityCepList(connection_end_point=[])
                            return nep.cep_list.connection_end_point

def connection_end_point (topo_uuid, node_uuid, nep_uuid, cep_uuid):
    """Retrieve NodeEdgePoint by ID

    :param topo_uuid: ID of Topology
    :type uuid: str
    :param node_uuid: ID of Node
    :type node_uuid: str
    :param nep_uuid: ID of NodeEdgePoint
    :type nep_uuid: str
    :param cep_uuid: ID of ConnectionEndPoint
    :type cep_uuid: str

    :rtype: ConnectionEndPoint
    """
    for topo in context.topology_context.topology:
        if topo.uuid == topo_uuid:
            for node in topo.node:
                if node.uuid == node_uuid:
                    for nep in node.owned_node_edge_point:
                        if nep.uuid == nep_uuid:
                            if not hasattr(nep, "cep_list"):
                                nep.cep_list = TapiConnectivityCepList(connection_end_point=[])
                            for cep in nep.cep_list.connection_end_point:
                                if cep.uuid == cep_uuid:
                                    return cep           

def connectivity_context ():
    """Retrieve ConnectivityContext

    :rtype: TapiConnectivityConnectivityContext
    """
    if context.connectivity_context is None:
        context.connectivity_context = TapiConnectivityConnectivityContext(
            connectivity_service=[], connection=[]
        )
    return context.connectivity_context

def connectivity_service_list ():
    """Retrieve all ConnectivityService

    :rtype: List(ConnectivityService)
    """
    if context.connectivity_context is None:
        context.connectivity_context = TapiConnectivityConnectivityContext(
            connectivity_service=[], connection=[]
        )
    return context.connectivity_context.connectivity_service


def connectivity_service (cs_uuid):
    """Retrieve ConnectivityService by ID

    :param cs_uuid: ID of ConnectivityService
    :type cs_uuid: str

    :rtype: Topology
    """
    if context.connectivity_context is None:
        context.connectivity_context = TapiConnectivityConnectivityContext(
            connectivity_service=[], connection=[]
        )
    for cs in context.connectivity_context.connectivity_service:
        if cs.uuid == cs_uuid:
            return cs
        
def connection (conn_uuid):
    """Retrieve Connection by ID

    :param conn_uuid: ID of Connection
    :type conn_uuid: str

    :rtype: Connection
    """
    if context.connectivity_context is None:
        context.connectivity_context = TapiConnectivityConnectivityContext(
            connectivity_service=[], connection=[]
        )
    for conn in context.connectivity_context.connection:
        if conn.uuid == conn_uuid:
            return conn
