"**** Scripted by Antony Silvester ****** "
import json
from urllib import addbase
import os


import requests
from requests.auth import HTTPBasicAuth


class BgpLs:

    def __init__( self ):
        self.localAs = 100
        self.maxSession = 20
        self.lsCapability = True
        self.holdTime = 180
        self.largeAsCapability = False
        self.flowSpecCapability = 'IPV4'
        self.flowSpecRpdCapability = False
        self.remoteAs = 100
        self.peerHoldTime = 120
        self.connectMode = 'active'
        self.bgpPeer = []
        self.routerId = ''
        self.peerIp = ''
        #self.org_bgp = []

    def ipValue( self, localip, remoteip ):
        self.routerId = localip
        self.peerIp = remoteip
        return self.routerId, self.peerIp

    def DictoJson( self ):
        Dicdata = {}
        org_bgp = []
        org_bgp.append( { 'peerIp': self.peerIp, 'remoteAs': self.remoteAs,
                          'peerHoldTime': self.peerHoldTime, 'connectMode': self.connectMode } )
        if self.routerId != '':
            Dicdata[ 'routerId' ] = self.routerId
        if self.localAs != '':
            Dicdata[ 'localAs' ] = self.localAs
        if self.maxSession != '':
            Dicdata[ 'maxSession' ] = self.maxSession
        if self.lsCapability != '':
            Dicdata[ 'lsCapability' ] = self.lsCapability
        if self.holdTime != '':
            Dicdata[ 'holdTime' ] = self.holdTime
        if self.largeAsCapability != '':
            Dicdata[ 'largeAsCapability' ] = self.largeAsCapability
        if self.flowSpecCapability != '':
            Dicdata[ 'flowSpecCapability' ] = self.flowSpecCapability
        if self.flowSpecRpdCapability != '':
            Dicdata[ 'flowSpecRpdCapability' ] = self.flowSpecRpdCapability
        if self.bgpPeer != '':
            Dicdata[ 'bgpPeer' ] = org_bgp

        Dicdata = { 'bgpapp': Dicdata }
        Dicdata = { 'org.onosproject.provider.bgp.cfg': Dicdata }
        Dicdata = { 'apps': Dicdata }
        return json.dumps( Dicdata, indent=4 )

    def Comments( self ):
        print( "**********************************************************************************\n" )

    def Constants( self ):
        self.Ne_id_1 = '1111.1111.0011'
        self.Ne_id_2 = '2222.2222.0022'
        self.Ne_id_3 = '3333.3333.0033'
        self.Ne_id_4 = '4444.4444.0044'
        listnum = [ self.Ne_id_1, self.Ne_id_2, self.Ne_id_3, self.Ne_id_4, ]
        var = [ self.peerIp ]
        return var, listnum

    def apps( self ):
        self.app_bgp = 'org.onosproject.bgp'
        self.app_bgpflow = 'org.onosproject.bgpflow'
        self.list1 = [ self.app_bgp, self.app_bgpflow ]
        return self.list1

    def checkLinks( self, linksResp ):
        #Declaring the links values
        links = { 'link1_src': "1650.5555.0055", 'link1_dst': "1660.6666.0066",
                  'link2_src': "1630.3333.0033", 'link2_dst': "1620.2222.0022",
                  'link3_src': "1660.6666.0066", 'link3_dst': "1650.5555.0055",
                  'link4_src': "1630.3333.0033", 'link4_dst': "1650.5555.0055",
                  'link5_src': "1640.4444.0044", 'link5_dst': "1610.1111.0011",
                  'link6_src': "1650.5555.0055", 'link4_dst': "1630.3333.0033",
                  'link7_src': "1620.2222.0022", 'link4_dst': "1630.3333.0033",
                  'link8_src': "1620.2222.0022", 'link4_dst': "1610.1111.0011",
                  'link9_src': "1630.3333.0033", 'link4_dst': "1640.4444.0044",
                  'link10_src': "1650.5555.0055", 'link4_dst': "1640.4444.0044",
                  'link11_src': "1610.1111.0011", 'link4_dst': "1640.4444.0044",
                  'link12_src': "1640.4444.0044", 'link4_dst': "1620.2222.0022",
                  'link13_src': "1660.6666.0066", 'link4_dst': "1630.3333.0033",
                  'link14_src': "1640.4444.0044", 'link4_dst': "1660.6666.0066",
                  'link15_src': "1640.4444.0044", 'link4_dst': "1630.3333.0033",
                  'link16_src': "1610.1111.0011", 'link4_dst': "1630.3333.0033",
                  'link17_src': "1630.3333.0033", 'link4_dst': "1610.1111.0011",
                  'link18_src': "1610.1111.0011", 'link4_dst': "1620.2222.0022",
                  'link19_src': "1620.2222.0022", 'link4_dst': "1640.4444.0044",
                  'link20_src': "1630.3333.0033", 'link4_dst': "1660.6666.0066",
                  'link21_src': "1640.4444.0044", 'link4_dst': "1650.5555.0055",
                  'link22_src': "1660.6666.0066", 'link4_dst': "1640.4444.0044"
                  }

        #Comparing the Links
        for x in xrange( 22 ):
            link_src_info = linksResp[ x ][ 'src' ][ 'device' ]
            link_dst_info = linksResp[ x ][ 'dst' ][ 'device' ]
            link_src_split = link_src_info.split( "=" )
            link_src = link_src_split[ 4 ]
            link_dst_split = link_dst_info.split( "=" )
            link_dst = link_dst_split[ 4 ]
            y = x + 1
            link_src_ref = links[ 'link' + str( y ) + '_src' ]
            link_dst_ref = links[ 'link' + str( y ) + '_dst' ]
            if ( link_src == link_src_ref ) and ( link_dst == ( link_dst_ref ) and
                                                   linksResp[ x ][ 'type' ] == 'DIRECT' and linksResp[ x ][ 'state' ] ==
                                                  'ACTIVE' ):
                return True
            else:
                return False
