master
  1class WarmUp
  2  attr_reader :exercise, :sets, :target_weight
  3
  4  def initialize(exercise, target_weight)
  5    @sets = []
  6    @exercise = exercise
  7    @target_weight = target_weight
  8    case exercise.name
  9    when "Deadlift"
 10      dead_lift_warmup
 11    when "Barbell Row"
 12      barbell_row_warmup
 13    else
 14      default_warmup
 15    end
 16  end
 17
 18  private
 19
 20  def add_set(weight, repetitions)
 21    @sets << WarmUpSet.new(
 22      exercise: exercise,
 23      target_weight: weight,
 24      target_repetitions: repetitions,
 25    )
 26    self
 27  end
 28
 29  def dead_lift_warmup
 30    return self if target_weight < 155.0
 31    return add_set(135.0, 5) if target_weight < 175.0
 32    add_set(135.0, 5)
 33    return add_set(165.0, 5) if target_weight < 200.0
 34    return add_set(175.0, 5) if target_weight < 220.0
 35    return add_set(185.0, 5) if target_weight < 225.0
 36    add_set(185.0, 5)
 37    return add_set(205.0, 5) if target_weight < 240.0
 38    return add_set(215.0, 5) if target_weight < 250.0
 39    return add_set(225.0, 5) if target_weight < 270.0
 40    add_set(225.0, 5)
 41    return add_set(245.0, 5) if target_weight < 275.0
 42    return add_set(255.0, 5) if target_weight < 290.0
 43    return add_set(265.0, 5) if target_weight < 301.0
 44    add_set(265.0, 3)
 45    return add_set(285.0, 1) if target_weight < 320.0
 46    return add_set(295.0, 1) if target_weight < 330.0
 47    return add_set(305.0, 1) if target_weight < 340.0
 48    return add_set(315.0, 1) if target_weight < 350.0
 49    add_set(315.0, 3)
 50    return add_set(335.0, 1) if target_weight < 360.0
 51    return add_set(340.0, 1) if target_weight < 370.0
 52    return add_set(345.0, 1) if target_weight < 380.0
 53    return add_set(350.0, 1) if target_weight < 390.0
 54    return add_set(355.0, 1) if target_weight < 395.0
 55    return add_set(360.0, 1) if target_weight < 400.0
 56    add_set(365.0, 1)
 57  end
 58
 59  def barbell_row_warmup
 60    return self if target_weight < 105.0 || target_weight < 65.0
 61    return add_set(95.0, 5) if target_weight < 145.0
 62    return add_set(115.0, 5) if target_weight < 160.0
 63    return add_set(65.0, 3) if target_weight < 105.0
 64    return add_set(75.0, 3) if target_weight < 125.0
 65    return add_set(85.0, 3) if target_weight < 135.0
 66    return add_set(135.0, 3) if target_weight < 185.0
 67    add_set(135.0, 5)
 68    return add_set(165.0, 3) if target_weight < 200.0
 69    return add_set(175.0, 3) if target_weight < 220.0
 70    return add_set(185.0, 3) if target_weight < 225.0
 71    add_set(185.0, 5)
 72    return add_set(205.0, 2) if target_weight < 240.0
 73    return add_set(215.0, 2) if target_weight < 250.0
 74    return add_set(225.0, 2) if target_weight < 270.0
 75    add_set(225.0, 5)
 76    return add_set(245.0, 1) if target_weight < 275.0
 77    return add_set(255.0, 1) if target_weight < 290.0
 78    return add_set(265.0, 1) if target_weight < 301.0
 79    add_set(265.0, 3)
 80    return add_set(285.0, 1) if target_weight < 320.0
 81    return add_set(295.0, 1) if target_weight < 330.0
 82    return add_set(305.0, 1) if target_weight < 340.0
 83    return add_set(315.0, 1) if target_weight < 350.0
 84    add_set(315.0, 3)
 85    return add_set(330.0, 1) if target_weight < 355.0
 86    return add_set(340.0, 1) if target_weight < 370.0
 87    return add_set(345.0, 1) if target_weight < 380.0
 88    return add_set(350.0, 1) if target_weight < 390.0
 89    return add_set(355.0, 1) if target_weight < 395.0
 90    return add_set(360.0, 1) if target_weight < 400.0
 91    add_set(365.0, 1)
 92  end
 93
 94  def default_warmup
 95    return self if target_weight < 65.0
 96    add_set(45.0, 5)
 97    add_set(45.0, 5)
 98    return self if target_weight < 95.0
 99    return add_set(65.0, 3) if target_weight < 105.0
100    return add_set(75.0, 3) if target_weight < 125.0
101    return add_set(85.0, 3) if target_weight < 135.0
102    add_set(95.0, 5)
103    return add_set(115.0, 3) if target_weight < 150.0
104    return add_set(125.0, 3) if target_weight < 160.0
105    return add_set(135.0, 3) if target_weight < 185.0
106    return add_set(135.0, 3) if target_weight < 185.0
107    add_set(135.0, 5)
108    return add_set(165.0, 3) if target_weight < 200.0
109    return add_set(175.0, 3) if target_weight < 220.0
110    return add_set(185.0, 3) if target_weight < 225.0
111    add_set(185.0, target_weight < 305.0 ? 3 : 5)
112    return add_set(205.0, 2) if target_weight < 240.0
113    return add_set(215.0, 2) if target_weight < 250.0
114    return add_set(225.0, 2) if target_weight < 270.0
115    add_set(225.0, target_weight < 305.0 ? 2 : 3)
116    return add_set(245.0, 1) if target_weight < 275.0
117    return add_set(255.0, 1) if target_weight < 290.0
118    return add_set(265.0, 1) if target_weight < 301.0
119    if target_weight < 305.0
120      add_set(265.0, 1)
121    elsif target_weight < 350.0
122      add_set(265.0, 2)
123    else
124      add_set(265.0, 3)
125    end
126    return add_set(285.0, 1) if target_weight < 320.0
127    return add_set(295.0, 1) if target_weight < 330.0
128    return add_set(305.0, 1) if target_weight < 340.0
129    return add_set(315.0, 1) if target_weight < 350.0
130    add_set(315.0, 2)
131    return add_set(330.0, 1) if target_weight < 355.0
132    return add_set(340.0, 1) if target_weight < 370.0
133    return add_set(345.0, 1) if target_weight < 380.0
134    return add_set(350.0, 1) if target_weight < 390.0
135    return add_set(355.0, 1) if target_weight < 395.0
136    return add_set(360.0, 1) if target_weight < 400.0
137    add_set(365.0, 1)
138  end
139end