"""
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 = '4'
        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 = [{'mac_address':'fa:16:3e:76:8e:88','ip_address':'192.168.1.1'}]
        self.deviceOwner = 'none'
        self.fixedIp = []
        self.securityGroups = [{'securityGroup':'asd'}]
        self.adminStateUp = True
        self.network_id = ''
        self.tenant_id = ''
        self.subnet_id = ''
        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.network_id == '' or self.subnet_id == '':
            print 'Id/tenant id/networkid/subnetId is necessary!'

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

        if self.id != '':
            Dicdata['id'] = self.id
        if self.state != '':
            Dicdata['status'] = self.state
        if self.bindingHostId != '':
            Dicdata['binding:host_id'] = self.bindingHostId
        if self.allowedAddressPairs != '':
            Dicdata['allowed_address_pairs'] = self.allowedAddressPairs
        if self.deviceOwner != '':
            Dicdata['device_owner'] = self.deviceOwner
        if self.securityGroups != '':
            Dicdata['security_groups'] = self.securityGroups
        if self.adminStateUp != '':
            Dicdata['admin_state_up'] = self.adminStateUp
        if self.network_id != '':
            Dicdata['network_id'] = self.network_id
        if self.tenant_id != '':
            Dicdata['tenant_id'] = self.tenant_id
        if self.bindingvifDetails != '':
            Dicdata['binding:vif_details'] = self.bindingvifDetails
        if self.bindingvnicType != '':
            Dicdata['binding:vnic_type'] = self.bindingvnicType
        if self.bindingvifType != '':
            Dicdata['binding:vif_type'] = self.bindingvifType
        if self.macAddress != '':
            Dicdata['mac_address'] = self.macAddress
        if self.deviceId != '':
            Dicdata['device_id'] = self.deviceId
        if self.name != '':
            Dicdata['name'] = self.name

        Dicdata['fixed_ips'] = fixedIp
        Dicdata = {'port': Dicdata}

        return json.dumps(Dicdata,indent=4)
