This is not a complex scenario, instead, it is common in many applications. Every application in a given user journey, goes through different states and at any step application can get into an undesired state and test might be failed.
So yes, it can be represented as an acceptance test/end to end test where on failing at any step, remaining steps will be skipped and the test will be marked as failed.
I think as a general rule of thumb you should try to minimize the number of asserts per test. However, as long as the test sufficiently narrows the problem to a specific place in the code, place it.
For error-handling, at any point in any step, if a step fails like
'Element not found' which raises an exception from selenium, which is
handled at cucumber level which further fails the test. So as an
automation developer we don't have to handle it explicitly.
As far as using given, when , then keywords are concerned , they are just syntactical sugar and under the hood they all are same as technically there is no difference. They are there to make a test more readable by nontechnical people as well.