> I'm not sure about the changes to the logic. If you look
> at Mul.flatten, you'll see lots of little inline comments telling what is going on.

Well, we can comment things in complexes.py line by line, but I think it's better to rewrite one if it's not clear what's going on *without* comments.

Let's do it this way:
```python
        if arg.is_Mul:
            c, args = arg.as_coeff_mul()
            unk = []
            is_imag = c.is_imaginary
            is_neg = c.is_negative
            for a in args:
                ai = -S.ImaginaryUnit * a
                if a.is_negative:
                    is_neg = not is_neg
                elif a.is_positive:
                    pass
                elif a.is_imaginary and ai.is_comparable:
                    is_imag = not is_imag
                    if ai.is_negative:
                        is_neg = not is_neg
                else:
                    unk.append(a)
            if c is S.One and len(unk) == len(args):
                return None
            return (S.NegativeOne if is_neg else S.One) \
                * (S.ImaginaryUnit if is_imag else S.One) \
                * cls(arg._new_rawargs(*unk))
```

What's looks unclear?