class DurationTimecode
  def self.parse(timecode)
    if match = DURATION_TIMECODE_REGEX.match(timecode)
      hours = match[1].to_i
      minutes = match[2].to_i
      seconds = match[3].to_i
      new(hours, minutes, seconds)
    else
      raise ArgumentError.new("Must be HH:MM:SS format")
    end
  end

  def self.from_seconds(total_seconds)
    hours = total_seconds / 60 / 60
    minutes = total_seconds / 60 % 60
    seconds = total_seconds % 60

    DurationTimecode.new(hours, minutes, seconds)
  end

  attr_reader :hours, :minutes, :seconds

  def initialize(hours, minutes, seconds)
    @hours = hours
    @minutes = minutes
    @seconds = seconds
  end

  def to_s
    [hours, minutes, seconds].map { |t| t.to_s.rjust(2,'0') }.join(':')
  end

  def to_i
    [
      hours * 60 * 60,
      minutes * 60,
      seconds
    ].sum
  end

  def +(other)
    DurationTimecode.from_seconds(to_i + other.to_i)
  end

  private

  DURATION_TIMECODE_REGEX = /\A(\d+):(\d+):(\d+)\z/
end
