Функция слишком сложна, ее нужно распилить на несколько.