def main():
    args = docopt(__doc__)

    frameworks_repo = Path(args["--frameworks-repo"]).resolve()
    framework_slug = args["<framework_slug>"]
    stage = args["<stage>"]
    lot = args["<lot>"]

    data_api_client = DataAPIClient(get_api_endpoint_from_stage(stage), get_auth_token('api', stage))

    content_loader = ContentLoader(frameworks_repo)
    content_loader.load_manifest(framework_slug, "services", "services_search_filters")
    manifest = content_loader.get_manifest(framework_slug, "services_search_filters")

    # FIXME there isn't a uniform way to get the lots from the framework
    # content repo, hard code for G-Cloud for now
    framework_lots = [
        {"name": "Cloud hosting", "slug": "cloud-hosting"},
        {"name": "Cloud software", "slug": "cloud-software"},
        {"name": "Cloud support", "slug": "cloud-support"},
    ]

    writer = csv.writer(sys.stdout)

    # do the thing
    writer.writerow(['serviceId', 'topLevelCategories'])
    for service in data_api_client.find_services_iter(framework=framework_slug, status='published', lot=lot):
        service_categories = service['serviceCategories'] if service.get('serviceCategories') else []

        top_level_categories = []

        for f in filters_for_lot(service['lot'], manifest, framework_lots)['categories']['filters']:
            children = [f['label'] for f in f['children']] if f.get('children') else []
            if any(item in service_categories for item in children):
                top_level_categories.append(f['label'])

        writer.writerow([service['id'], '; '.join(top_level_categories)])
    args = parser.parse_args()

    FILENAME = f'{args.framework_slug}-all-successful-suppliers.csv'

    client = DataAPIClient(base_url=get_api_endpoint_from_stage(args.stage),
                           auth_token=get_auth_token('api', args.stage))

    logger.info('Retrieving framework ...')
    all_lot_names = [
        lot['name'] for lot in client.get_framework(args.framework_slug)
        ['frameworks']['lots']
    ]
    map_suppliers_to_lots = {}

    logger.info('Looking up supplier services ...')
    all_framework_services = client.find_services_iter(
        framework=args.framework_slug)
    for service in all_framework_services:
        if service['supplierId'] not in map_suppliers_to_lots:
            map_suppliers_to_lots[service['supplierId']] = {
                'name': service['supplierName'],
                'lots': set()
            }

        map_suppliers_to_lots[service['supplierId']]['lots'].add(
            service['lotName'])

    with open(FILENAME, 'w') as csvfile:
        writer = csv.writer(csvfile, quoting=csv.QUOTE_MINIMAL)
        writer.writerow(['Supplier'] + all_lot_names)

        sorted_suppliers = (x for x in sorted(map_suppliers_to_lots.values(),