#! /usr/bin/env python
import yaml
import json
import urlparse
import urllib3
import logging
import argparse

http = urllib3.PoolManager()
logger_name='neutron_nb_flush'
logger = logging.getLogger(logger_name)
logger.setLevel(logging.DEBUG)
file_handler = logging.FileHandler('/tmp/{}.log'.format(logger_name))
file_handler.setFormatter(logging.Formatter('%(asctime)s %(levelname)s: %(message)s'))
logger.addHandler(file_handler)


def _request(method, url, credentials):
    headers = urllib3.make_headers(basic_auth=credentials)
    return http.request(method, url, headers=headers)


def _del(url, credentials=None):
    logger.info('Deleting url {}'.format(url))
    return _request('DELETE', url, credentials=credentials)


def _get(url, credentials=None):
    return _request('GET', url, credentials=credentials)


def _get_ids(url, credentials, key):
    ids = []
    try:
        res_data = json.loads(_get('{}'.format(url), credentials=credentials).data)
        entries_keys = res_data.keys()
        entries = res_data[entries_keys[0]]

        for entry in entries:
            ids.append(entry[key])

    except ValueError as e:
        logger.warning("Get on url {} didn't return a json. Skipping, full error: {}".format(url, e))

    finally:
        return ids


def delete_all(url, credentials, key):
    ids = _get_ids(url, credentials, key)
    if len(ids) > 0:
        logger.info("Found entries with ids {} in {}, attempting to delete them".format(', '.join(ids), url))
        if ids is not None:
            for resource_id in ids:
                del_url = '/'.join([url, resource_id])
                _del(del_url, credentials)
    else:
        logger.info("No entries found in {}".format(url))


if __name__ == '__main__':
    parser = argparse.ArgumentParser(description="Remove all data in odls' neutron northbound")
    parser.add_argument('-c', '--config-yaml', default='data/neutron_nb_uris.yaml',
                        help='The input config yaml')

    args = parser.parse_args()
    with open(args.config_yaml) as yaml_buf:
        yaml_conf = yaml.load(yaml_buf)

    scheme = yaml_conf['scheme']
    host = yaml_conf['host']
    port = yaml_conf['port']
    username = yaml_conf['username']
    password = yaml_conf['password']
    list_key = yaml_conf['key']

    mysql_credentials = ':'.join((username, password))
    netloc = ':'.join((host, str(port)))
    base = '://'.join((scheme, netloc))

    neutron_nb_urls = []
    for uri in yaml_conf['odl_nb_uris']:
        odl_nb_url = urlparse.urljoin(base, uri)
        logger.info('Parsed url {}'.format(odl_nb_url))
        neutron_nb_urls.append(odl_nb_url)

    for neutron_nb_url in neutron_nb_urls:
        delete_all(neutron_nb_url, mysql_credentials, list_key)