Сделан небольшой рефакторинг, большая часть логики вынесена в отдельный класс Primary