def constraints_violated(constraints):
    """
    :param constraints: constraints to be evaluated
    :return [0]: True if there are any constraints that are violated, false otherwise
    :return [1]: Maximum violation if one or more constraints exist, else None
    :return [2]: Name of the maximum constraint violated if one or more constraints exist, else None
    """
    n = []
    v = []
    violated = False
    for constraint_name, constraint in constraints.items():
        n.append(constraint_name)
        v.append(constraint.violation)
        if constraint.violated:
            violated = True
    if not v:
        return False, None, None
    return violated, max(v), n[v.index(max(v))]