"""Several named jobs, in one `MultiBar`, finishing at different times.

Reach for `MultiBar` instead of hand-rolled `line_offset` bars when the jobs
are a single logical group -- it lays them out for you, and its context
manager waits for every job to finish before letting the `with` block exit.
Add a job with a subscript (`multibar[label]`); each one here reaches its
own target and calls `finish()` independently, so you can watch them
complete one at a time. Finished bars stay on screen rather than
disappearing -- `remove_finished` defaults to an hour.
"""

import random
import sys
import time

import progressbar

random.seed(0)

JOBS = {
    'download': 18,
    'extract': 10,
    'build': 26,
    'test': 22,
}


def main() -> None:
    with progressbar.MultiBar(fd=sys.stdout) as multibar:
        for name, total in JOBS.items():
            multibar[name].max_value = total

        remaining = dict(JOBS)
        while remaining:
            name = random.choice(list(remaining))
            multibar[name].increment()
            if multibar[name].value >= remaining[name]:
                multibar[name].finish()
                del remaining[name]
            time.sleep(0.01)


if __name__ == '__main__':
    main()