RBB and alvinado are right. It is the battery.
Did not have a multimeter so did not manage to check battery voltage.
My bro came home so asked him to jump start my car with his car. No luck - I heard one crank and it was still back to no crank, only tick-tick sounds. Was so dismayed, so I heeded redline15's suggestion and called BMW roadside assistance.
The operator told me the guy will come to attempt to start the car and diagnose the fault if can't be restarted. I specifically asked very clearly if I had to pay. She told me battery up to $700(!), and if not battery fault, I can tow to PML to fix. I thought "wah lao PML", and asked if I can choose to tow to my WS and if so, do I need to pay the BMW assistance guy. She said no need to pay even if i choose not to go to PML.
So after 90 min, the guy came to try to restart with a portable jumpstarter. It worked, to my amazament, and he told me not to try jumpstarting with another vehicle. It may fry either cars' electrics. He whipped out his multimeter, the voltage is 14V+ when engine is on, in the low 12V when engine off.
He quoted $314 for a replacement battery, and showed me the official PML quotation sheet. I asked if I changed at my WS, do I need to pay him. He said no, so I called my WS and he quoted $170 for a similar size of my current battery, and $240 for a larger one. He restarted my car one last time and I thanked him, and drove to get an Amaron battery at $240.
My 2005 320i didnt require battery registration, so after replacement, it was driving as usual. Maybe it is the horror stories of BMWs I have been reading in forums - always thinking the worst has come, when it is something small like a flat and retired battery.
Much thanks to RBB, alvinado, and redlne15 for your various advices.