"""
This file provide the data
lanqinglong@huawei.com
"""
import json

class NetworkData:

    def __init__(self):
        self.id = ''
        self.state = 'ACTIVE'
        self.name = 'onosfw-1'
        self.physicalNetwork = 'none'
        self.admin_state_up = 'true'
        self.tenant_id = ''
        self.routerExternal = 'false'
        self.type ='LOCAL'
        self.segmentationID = '6'
        self.shared = 'false'

    def DictoJson(self):

        if self.id =='' or self.tenant_id == '':
            print 'Id and tenant id is necessary!'

        Dicdata = {}
        if self.id !='':
            Dicdata['id'] = self.id
        if self.state != '':
            Dicdata['status'] = self.state
        if self.name !='':
            Dicdata['name'] = self.name
        if self.physicalNetwork !='':
            Dicdata['provider:physical_network'] = self.physicalNetwork
        if self.admin_state_up !='':
            Dicdata['admin_state_up'] = self.admin_state_up
        if self.tenant_id !='':
            Dicdata['tenant_id'] = self.tenant_id
        if self.routerExternal !='':
            Dicdata['router:external'] = self.routerExternal
        if self.type !='':
            Dicdata['provider:network_type'] = self.type
        if self.segmentationID !='':
            Dicdata['provider:segmentation_id'] = self.segmentationID
        if self.shared !='':
            Dicdata['shared'] = self.shared

        Dicdata = {'network': Dicdata}

        return json.dumps(Dicdata,indent=4)

    def Ordered(self,obj):

        if isinstance(obj, dict):
            return sorted((k,self.Ordered(v)) for k,  v in obj.items())
        if isinstance(obj, list):
            return sorted(self.Ordered(x) for x in obj )
        else:
            return obj

    def JsonCompare(self,SourceData,DestiData,FirstPara,SecondPara):

        try:
            SourceCompareDataDic = json.loads(SourceData)
            DestiCompareDataDic = json.loads(DestiData)
        except ValueError:
            print "SourceData or DestData is not JSON Type!"
            return False

        try:
            Socom = SourceCompareDataDic[FirstPara][SecondPara]
            Decom = DestiCompareDataDic[FirstPara][SecondPara]
        except KeyError,error:
            print "Key error ,This key is not found:%s"%error
            return False            

        if str(Socom).lower()== str(Decom).lower():
            return True
        else:
            print "Source Compare data:"+FirstPara+"."+SecondPara+"="+str(Socom)
            print "Dest Compare data: "+FirstPara+"."+SecondPara+"="+str(Decom)
            return False

class SubnetData(NetworkData):

    def __init__(self):
        self.id = ''
        self.tenant_id = ''
        self.network_id = ''
        self.nexthop = '192.168.1.1'
        self.destination = '192.168.1.1/24'
        self.start = '192.168.2.2'
        self.end = '192.168.2.254'
        self.ipv6_address_mode = 'DHCPV6_STATELESS'
        self.ipv6_ra_mode = 'DHCPV6_STATELESS'
        self.cidr = '192.168.1.1/24'
        self.enable_dhcp = 'true'
        self.dns_nameservers = 'aaa'
        self.gateway_ip = '192.168.2.1'
        self.ip_version = 'INET'
        self.shared = 'false'
        self.name = 'demo-subnet'

    def DictoJson(self):
        if self.id =='' or self.tenant_id == '':
            print 'Id and tenant id is necessary!'

        Dicdata = {}
        host_routesdata = []
        host_routesdata.append({'nexthop': self.nexthop,'destination': self.destination})
        allocation_pools = []
        allocation_pools.append({'start': self.start,'end':self.end})

        if self.id != '':
            Dicdata['id'] = self.id
        if self.network_id != '':
            Dicdata['network_id'] = self.network_id
        if self.name != '':
            Dicdata['name'] = self.name
        if self.nexthop != '':
            Dicdata['host_routes'] = host_routesdata
        if self.tenant_id != '':
            Dicdata['tenant_id'] = self.tenant_id
        if self.start != '':
            Dicdata['allocation_pools'] = allocation_pools
        if self.shared != '':
            Dicdata['shared'] = self.shared
        if self.ipv6_address_mode != '':
            Dicdata['ipv6_address_mode'] = self.ipv6_address_mode
        if self.ipv6_ra_mode != '':
            Dicdata['ipv6_ra_mode'] = self.ipv6_ra_mode
        if self.cidr != '':
            Dicdata['cidr'] = self.cidr
        if self.enable_dhcp != '':
            Dicdata['enable_dhcp'] = self.enable_dhcp
        if self.dns_nameservers != '':
            Dicdata['dns_nameservers'] = self.dns_nameservers
        if self.gateway_ip != '':
            Dicdata['gateway_ip'] = self.gateway_ip
        if self.ip_version != '':
            Dicdata['ip_version'] = self.ip_version

        Dicdata = {'subnet': Dicdata}

        return json.dumps(Dicdata,indent=4)

class VirtualPortData(NetworkData):

    def __init__(self):
        self.id = ''
        self.state = 'ACTIVE'
        self.bindingHostId = 'fa:16:3e:76:8e:88'
        self.allowedAddressPairs = [{'macAddress':'fa:16:3e:76:8e:88','ipAddress':'192.168.1.1'}]
        self.deviceOwner = 'none'
        self.fixedIp = []
        self.securityGroups = [{'securityGroup':'asd'}]
        self.adminStateUp = 'true'
        self.networkId = ''
        self.tenantId = ''
        self.subnetId = ''
        self.bindingvifDetails = 'port_filter'
        self.bindingvnicType = 'normal'
        self.bindingvifType = 'ovs'
        self.macAddress = 'fa:16:3e:76:8e:88'
        self.deviceId = 'a08aa'
        self.name = 'u'

    def DictoJson(self):
        if self.id == '' or self.tenant_id == ' ' or self.networkId == '':
            print 'Id/tenant id/networkid/subnetId is necessary!'

        Dicdata = {}
        fixedIp =[]
        fixedIp.append({'subnetId':self.subnetId,'ipAddress':'192.168.1.4'})
        allocation_pools = []

        if self.id != '':
            Dicdata['id'] = self.id
        if self.state != '':
            Dicdata['state'] = self.state
        if self.bindingHostId != '':
            Dicdata['bindingHostId'] = self.bindingHostId
        if self.allowedAddressPairs != '':
            Dicdata['allowedAddressPairs'] = self.allowedAddressPairs
        if self.deviceOwner != '':
            Dicdata['deviceOwner'] = self.deviceOwner
        if self.fixedIp != []:
            Dicdata['fixedIp'] = fixedIp
        if self.securityGroups != '':
            Dicdata['securityGroups'] = self.securityGroups
        if self.adminStateUp != '':
            Dicdata['adminStateUp'] = self.adminStateUp
        if self.networkId != '':
            Dicdata['networkId'] = self.networkId
        if self.tenantId != '':
            Dicdata['tenantId'] = self.tenantId
        if self.subnetId != '':
            Dicdata['subnetId'] = self.subnetId
        if self.bindingvifDetails != '':
            Dicdata['bindingvifDetails'] = self.bindingvifDetails
        if self.bindingvnicType != '':
            Dicdata['bindingvnicType'] = self.bindingvnicType
        if self.bindingvifType != '':
            Dicdata['bindingvifType'] = self.bindingvifType
        if self.macAddress != '':
            Dicdata['macAddress'] = self.macAddress
        if self.deviceId != '':
            Dicdata['deviceId'] = self.deviceId
        if self.name != '':
            Dicdata['name'] = self.name

            Dicdata = {'virtualport': Dicdata}

            return json.dumps(Dicdata,indent=4)