static function getAvailableTransitions(PaymentInterface $payment, $admin = false)
    {
        // TODO use payum to select gateway's supported requests/actions.

        $transitions = [];

        $method = $payment->getMethod();
        $state = $payment->getState();

        if ($admin) {
            if ($method->isManual()) {
                switch ($state) {
                    case PaymentStates::STATE_PENDING:
                        $transitions[] = static::TRANSITION_CANCEL;
                        $transitions[] = static::TRANSITION_ACCEPT;
                        break;
                    case PaymentStates::STATE_CAPTURED:
                        $transitions[] = static::TRANSITION_CANCEL;
                        $transitions[] = static::TRANSITION_HANG;
                        $transitions[] = static::TRANSITION_REFUND;
                        break;
                    case PaymentStates::STATE_REFUNDED:
                        $transitions[] = static::TRANSITION_CANCEL;
                        $transitions[] = static::TRANSITION_HANG;
                        $transitions[] = static::TRANSITION_ACCEPT;
                        break;
                    case PaymentStates::STATE_CANCELED:
                        $transitions[] = static::TRANSITION_HANG;
                        $transitions[] = static::TRANSITION_ACCEPT;
                        break;
                }
            } elseif ($method->isOutstanding() || $method->isManual()) {
                if ($state === PaymentStates::STATE_CAPTURED) {
                    $transitions[] = static::TRANSITION_CANCEL;
                } else {
                    $transitions[] = static::TRANSITION_ACCEPT;
                }
            } else {
                if ($state === PaymentStates::STATE_CAPTURED) {
                    $transitions[] = static::TRANSITION_REFUND;
                }
                if ($state === PaymentStates::STATE_PENDING) {
                    $diff = $payment->getUpdatedAt()->diff(new \DateTime());
                    if (0 < $diff->days && !$diff->invert) {
                        $transitions[] = static::TRANSITION_CANCEL;
                    }
                }
            }
        } else {
            if ($method->isManual() && $state === PaymentStates::STATE_PENDING) {
                $transitions[] = static::TRANSITION_CANCEL;
            }
        }

        return $transitions;
    }