This method is very long. I'd do some extract methods. A few suggestions for where below.