import requests
import yaml

GITOYEN_ASN = 0
PEER_ASN_LIST = []

gitoyen_peering_factory = []
ses = requests.session()
peer = dict()

# Load config
try:
    config = yaml.load(open('config/settings.yml'))
    GITOYEN_ASN = config['ASN']
    PEER_ASN_LIST = config['PEERS']
except:
    print("Failed to load config exiting..")
    exit(1)

# List Gitoyen Factory with IPv6 avaidable
factory_request = ses.get("https://peeringdb.com//api/netixlan?asn=" + str(GITOYEN_ASN))
for factory in factory_request.json()['data']:
    if factory['ipaddr6'] is not None:
        gitoyen_peering_factory.append(factory)

for factory in gitoyen_peering_factory:
    name = (str(factory['name'])).split(' ')[0].lower()
    print("Generation en cours pour " + name)
    peer[name] = dict()
    for asn in PEER_ASN_LIST:
        info_request = ses.get(
            "https://peeringdb.com/api/netixlan?asn=" + str(asn) + "&ix_id=" + str(factory['ix_id']))
        result = info_request.json()['data']
        if len(result) > 0:
            if result[0]['is_rs_peer']:
                print('AS'+str(asn)+" is a RS peer, skipping")
                continue
            name_request = ses.get('https://peeringdb.com/api/net?asn=' + str(asn)).json()
            peer[name][asn] = dict()
            peer[name][asn]['description'] = name_request['data'][0]['name']
            if name_request['data'][0]['irr_as_set'] is not None and len(name_request['data'][0]['irr_as_set']) > 0:
                peer[name][asn]['import'] = name_request['data'][0]['irr_as_set']
            else:
                peer[name][asn]['import'] = "AS" + str(asn)
            peer[name][asn]['export'] = "AS-GITOYEN"
            peer[name][asn]['peerings'] = []
            if name_request['data'][0]['info_prefixes4'] is not None:
                peer[name][asn]['limit_ipv4'] = int(name_request['data'][0]['info_prefixes4'])
            if name_request['data'][0]['info_prefixes6'] is not None:
                peer[name][asn]['limit_ipv6'] = int(name_request['data'][0]['info_prefixes6'])
            delete = True
            for routeur in result:
                if routeur['ipaddr4'] is not None:
                    peer[name][asn]['peerings'].append(routeur['ipaddr4'])
                    print(
                        "Generating configuration at " + name + " for the router " + str(routeur['ipaddr4']) + " of the AS " + str(
                            asn) + " " + peer[name][asn]['description'])
                if routeur['ipaddr6'] is not None:
                    peer[name][asn]['peerings'].append(routeur['ipaddr6'])
                    print(
                        "Generating configuration at " + name + " for the router " + str(routeur['ipaddr6']) + " of the AS " + str(
                            asn) + " " + peer[name][asn]['description'])
                delete = False
            if delete:
                peer[name].pop(asn, None)

for gix in peer:
    with open("peers/" + gix + '.yml', 'w') as outfile:
        yaml.dump(peer[gix], outfile, default_flow_style=False)
        outfile.close()