#!/usr/bin/python3

import asyncio
import concurrent.futures
import qubesadmin


def get_max(qube):
    return int(qube.features.get("preload-dispvm-max", 0) or 0)


async def main():
    app = qubesadmin.Qubes()
    domains = app.domains
    default_dispvm = getattr(app, "default_dispvm", None)
    appvms = [
        qube
        for qube in domains
        if get_max(qube) > 0
        and (
            (
                qube.klass == "AppVM"
                and getattr(qube, "template_for_dispvms", False)
            )
            or (qube.name == "dom0" and default_dispvm)
        )
    ]
    method = "admin.vm.CreateDisposable"
    loop = asyncio.get_running_loop()
    tasks = []
    if "dom0" in appvms and default_dispvm in appvms:
        appvms.remove(default_dispvm)
    with concurrent.futures.ThreadPoolExecutor() as executor:
        for qube in appvms:
            maximum = get_max(qube)
            msg = f"{qube}:{maximum}"
            if qube.name == "dom0":
                qube = default_dispvm
                msg = "global:" + msg
            print(msg)
            exec_args = qube.qubesd_call, qube.name, method, "preload-autostart"
            future = loop.run_in_executor(executor, *exec_args)
            tasks.append(future)
        await asyncio.gather(*tasks)


if __name__ == "__main__":
    asyncio.run(main())
