Я бы поразбивал на приватные методы эту функцию, вложенность очень большая.