#!/usr/bin/env python3

import getopt
import platform
import sys

import yaml


def usage():
    print(f"Usage: {sys.argv[0]} -c|--config <config file>[-h]")
    print("")
    print("Options:")
    print("  -c, --config <file>     config file")
    print("")


def yaml_param(loader, node):
    params = loader.app_params
    default = None
    key = node.value

    assert type(key) is str, f"param name must be a string"

    if '=' in key:
        key, default = [t.strip() for t in key.split('=', maxsplit=1)]

        if key in params:
            value = params[key]
        else:
            value = yaml.safe_load(default)
    else:
        assert key in params, f"no param set for '{key}', and there is no default"
        value = params[key]

    return value


def main():
    config_file = None
    params = {}

    try:
        opts, args = getopt.getopt(sys.argv[1:], 'c:h', longopts=['config='])
    except:
        print(f"{sys.argv[0]}: invalid option")
        sys.exit(2)

    for o, a in opts:
        if o in ['-c', '--config']:
            config_file = a
        elif o in ['-h']:
            usage()
            sys.exit(0)
        else:
            assert False, f"unhandled option {o}"

    assert config_file is not None, "no config file specified"

    if config_file is not None:
        f = open(config_file, 'r')

    yaml_loader = yaml.SafeLoader
    yaml_loader.app_params = params
    yaml.add_constructor("!param", yaml_param, Loader=yaml_loader)

    config = yaml.load(f, Loader=yaml_loader)
    if f != sys.stdin:
        f.close()

    pkg_list = set()

    arch = platform.machine()

    if 'packages' in config:
        for p in config['packages']:
            pkg_list.add(p)

    if f'packages_{arch}' in config:
        for p in config[f'packages_{arch}']:
            pkg_list.add(p)

    if 'additional_packages' in config:
        for p in config['additional_packages']:
            pkg_list.add(p)

    if 'packagelist_file' in config:
        with open(config['packagelist_file'], 'r') as f:
            pkg_config = yaml.load(f, Loader=yaml_loader)
            for p in pkg_config['packages']:
                pkg_list.add(p)
            if f'packages_{arch}' in pkg_config:
                for p in pkg_config[f'packages_{arch}']:
                    pkg_list.add(p)

    if f'linux_flavor_{arch}' in config:
        pkg_list.add(config[f'linux_flavor_{arch}'])
    elif 'linux_flavor' in config:
        pkg_list.add(config['linux_flavor'])

    if 'ansible' in config:
        pkg_list.add("python3")

    # TODO - figure out if needed based on disk layout
    pkg_list.add("lvm2")
    pkg_list.add("grub2-efi-image")

    # needed for ISO
    pkg_list.add("photon-iso-config")
    if arch == "x86_64":
        pkg_list.add("syslinux")

    for p in pkg_list:
        print(p)


if __name__ == "__main__":
    main()
