import argparse
import random
import time

def do_work(duration, result):
    t = random.uniform(duration/5 * 0.5, duration/5 * 1.5)
    time.sleep(t)
    return result

def fetch_olive_oil():
    print('Fetching olive oil…')
    return do_work(5, 'oil')

def fetch_dako_rusk():
    print('Fetching dako rusk…')
    return do_work(5, 'rusk')

def fetch_tomato():
    print('Fetching tomato…')
    return do_work(3, 'tomato')

def fetch_feta():
    print('Fetching feta…')
    return do_work(3, 'feta')

def chop_tomato(tomato):
    assert tomato == 'tomato'
    print('Chopping tomato…')
    return do_work(1, f'chopped {tomato}')

def water_rusk(rusk):
    assert rusk == 'rusk'
    print('Watering rusk…')
    return do_work(0.2, f'wet {rusk}')

def oil_rusk(rusk, oil):
    assert rusk == 'wet rusk'
    assert oil == 'oil'
    print(f'Pouring {oil} on {rusk}…')
    return do_work(0.5, f'{rusk} with {oil}')

def decorate_rusk(rusk, *toppings):
    result = rusk
    for topping in toppings:
        print(f'Putting {topping} on {result}…')
        result = do_work(1, f'{result} with {topping}')
    return result

def store_dako(dako):
    print(f'Storing {dako}')
    do_work(1, None)

def prepare_dako():
    print('Making dako…')
    oil = fetch_olive_oil()
    rusk = fetch_dako_rusk()
    tomato = fetch_tomato()
    tomato = chop_tomato(tomato)
    rusk = water_rusk(rusk)
    rusk = oil_rusk(rusk, oil)
    feta = fetch_feta()
    dako = decorate_rusk(rusk, tomato, feta)
    store_dako(dako)
    print(f'{dako} is ready!')

def prepare_dakos(n_dakos):
    for n in range(args.n_dakos):
        prepare_dako()

def parse_args():
    p = argparse.ArgumentParser()
    p.add_argument(
        'n_dakos',
        type=int,
        nargs='?',
        default=1,
        help='How many dakos to make?',
    )
    return p.parse_args()

if __name__ == '__main__':
    args = parse_args()
    prepare_dakos(args.n_dakos)
