#!/usr/bin/env python3
import yaml
import sys
import argparse


class ModifiedParser(argparse.ArgumentParser):
    """
    modified error handling to print help
    """
    def error(self, message):
        sys.stderr.write('error: %s\n' % message)
        self.print_help()
        sys.exit(2)


def create_blacklist(config_file):
    """
    Generate a list of images which needs to be excluded from docker_image_list
    :param config_file: application_configuration file where images are.
    :return:
    """
    with open(config_file, 'r') as f:
        file = yaml.load(f, Loader=yaml.SafeLoader)

        blacklist=[]
        for name, _ in file['runtime_images'].items():
            path = file['runtime_images'][name]['path']
            blacklist.append(path[1:])
    return blacklist


def should_remove_line(line, blacklist):
    """
    Helping function to match image in blacklist
    :param line: line in datalist file
    :param blacklist: list of images to be removed
    :return
    """
    return any([image in line for image in blacklist])


def update_datalist(config_file, datalist):
    """
    remove local images from datalist.
    :param config_file: application_configuration file where images are.
    :param datalist: docker_image_list to be updated
    :return:
    """
    blacklist = create_blacklist(config_file)
    data = []
    with open(datalist, 'r') as f:
        for line in f:
            if not should_remove_line(line, blacklist):
                data.append(line)
    with open(datalist, 'w') as f:
        for line in data:
            f.write(line)


def run_cli():
    """
    Run as cli tool
    """

    parser = ModifiedParser(description='Remove runtime images from docker_image_list')

    parser.add_argument('config_file',
                        help='application_configuration file where images are')
    parser.add_argument('datalist',
                        help='docker_image_list from where images should be removed')
    args = parser.parse_args()

    update_datalist(args.config_file, args.datalist)


if __name__ == '__main__':
    run_cli()
