master
 1class Csv::Workout
 2  attr_accessor :date, :note, :workout
 3  attr_accessor :body_weight_kg, :body_weight_lb
 4  attr_accessor :exercises
 5
 6  def initialize(attributes = {})
 7    attributes.each do |attribute|
 8      send("#{attribute.first}=", attribute.last)
 9    end
10    @exercises = []
11  end
12
13  def workout
14    find(OpenStruct.new(name: 'Deadlift')) ? 'B' : 'A'
15  end
16
17  def find(exercise)
18    exercises.detect do |x|
19      x.matches?(exercise)
20    end
21  end
22
23  def self.map_from(row, user)
24    date = user.time_zone.local_to_utc(Date.strptime(row[0], "%m/%d/%y").to_time)
25
26    workout = new(date: date, note: row[1], body_weight_kg: row[2], body_weight_lb: row[3])
27    # skip additional exercises for now
28    row[4..-1].take(3 * 8).each_slice(8) do |slice|
29      workout.exercises << Csv::Exercise.new(
30        name: slice[0],
31        weight_kg: slice[1],
32        weight_lb: slice[2],
33        sets: slice[3..(slice.size)],
34      )
35    end
36
37    # import additional exercises
38    row[(4 + (3 * 8))..-1].each_slice(6) do |slice|
39      next if slice[0].nil?
40      exercise = Csv::Exercise.new(
41        name: slice[0],
42        weight_kg: slice[1],
43        weight_lb: slice[2],
44        sets: slice[3..(slice.size)],
45      )
46      workout.exercises << exercise
47    end
48    workout
49  end
50end