def pq(lasten):
    p = sum(w for w, pf in lasten)
    q = sum(w*math.tan(math.acos(pf)) for w, pf in lasten)
    return p, q, math.hypot(p, q)

def kies_lasten(c, gevraagd, bus_W, spanning, piek=False):
    """Volgorde bepaalt prioriteit; elke afgewezen dienst blijft in het log."""
    geleverd, geweigerd, lasten = {}, {}, []
    limiet = c["omvormer_piek_VA"] if piek else c["omvormer_cont_VA"]
    stroom = c["b48_piek_A"] if piek else c["b48_ontlaad_A"]
    for naam, w, pf in gevraagd:
        p, q, s = pq(lasten+[(w, pf)])
        dc = p/c["omvormer_eta"]+c["omvormer_nullast_W"]
        if s <= limiet and dc <= bus_W and dc/spanning <= stroom:
            geleverd[naam] = w
            lasten.append((w, pf))
        else:
            geleverd[naam], geweigerd[naam] = 0.0, w
    p, q, s = pq(lasten)
    dc = p/c["omvormer_eta"]+c["omvormer_nullast_W"] if p else 0
    return geleverd, geweigerd, (p, q, s, dc)
