human
I wrote the below code

    from sympy.simplify.fu import fu
    expr = sympify(expr)
    try:
        return expr._eval_trigsimp(**opts)
    except AttributeError:
        pass
    old = opts.pop('old', False)
    if (not old):
        opts.pop('deep', None)
        recursive = opts.pop('recursive', None)
        method = opts.pop('method', 'matching')
    else:
        method = 'old'
    def groebnersimp(ex, **opts):
        def traverse(e):
            if e.is_Atom:
                return e
            args = [traverse(x) for x in e.args]
            if (e.is_Function or e.is_Pow):
                args = [trigsimp_groebner(x, **opts) for x in args]
            return e.func(*args)
        new = traverse(ex)
        if (not isinstance(new, Expr)):
            return new
        return trigsimp_groebner(new, **opts)
    trigsimpfunc = {'fu': (lambda x: fu(x, **opts)), 'matching': (lambda x: futrig(x)), 'groebner': (lambda x: groebnersimp(x, **opts)), 'combined': (lambda x: futrig(groebnersimp(x, polynomial=True, hints=[2, tan]))), 'old': (lambda x: trigsimp_old(x, **opts))}[method]
    return trigsimpfunc(expr)

What's a good function header?
assistant
#Here's a good function header.

def trigsimp(expr, **opts):