@startuml
scale 350 width
[*] -> IDLE
IDLE --> WAIT_PIN: user.insert_card[card_valid]\n/card=e.card
IDLE --> WAIT_COLLECT: user.insert_card\n[card_unknown]\n/eject card
IDLE --> IDLE: user.insert_card\n[card_lost card_expired]\n/confiscate card
WAIT_PIN --> WAIT_AMOUNT: user.pin[pin_ok]/None
WAIT_PIN --> WAIT_PIN: user.pin[pin_err and tried<3]\n/tried++
WAIT_PIN --> IDLE: user.pin[pin_err and tried>=3]\n/confiscate card
WAIT_AMOUNT --> WAIT_COLLECT: user.amount[amount_ok]\n/dispense cash\neject card
WAIT_AMOUNT --> WAIT_COLLECT: user.amount\n[amount_exceed or insuffcient]\n/eject card
WAIT_COLLECT --> IDLE: user.collect/None
WAIT_COLLECT --> IDLE: system.timed/confiscate card
@enduml