grammar Period

rule period
  ( 
    number 
    [\s]* 
    time_unit 
    [\s]*
    loop:loop?
    {
      def timestamp?; false end

      def to_seconds
        if time_unit.second?
          number.text_value.to_f
        elsif time_unit.minute?
          number.text_value.to_f * 60
        elsif time_unit.hour?
          number.text_value.to_f * 60 * 24
        end
      end

      def to_days
        if time_unit.second?
          number.text_value.to_f / 86400
        elsif time_unit.minute?
          number.text_value.to_f / 1440
        elsif time_unit.hour?
          number.text_value.to_f / 24
        end
      end

      def loop?; not loop.text_value.empty? end
    }
  )
  / 
  ( 
    hour:[\d]1..2 
    (':')?
    minute:[\d]2..2 
    (':' second:[\d]2..2)?
    ([\s]* 'am' / 'pm')?
    {
      def timestamp?; true end
      def date_hash
        {
          :hour => hour.text_value.to_f,
          :minute => minute.text_value.to_f,
          :second => second.text_value.to_f
        }
      end
    }
  )
end

rule number
  [\d]+
end

rule time_unit
  second / minute / hour
end

rule word_end
  !(!' ' .)
end

rule second
  (en_second / pt_second)
  {
    def second?; true end
    def minute?; false end
    def hour?; false end
  }
end

rule en_second
  'seconds' word_end 
  / 
  'second' word_end 
  / 
  'secs' word_end 
  / 
  'sec' word_end 
  / 
  's' word_end
end

rule pt_second
  'segundo' word_end
  /
  'segundos' word_end
  /
  'seg' word_end
  /
  'segs' word_end
  /
  's' word_end
end

rule minute
  (en_minute / pt_minute)
  {
    def minute?; true end
    def second?; false end
    def hour?; false end
  }
end

rule en_minute
  'minute' word_end 
  / 
  'minutes' word_end
  / 
  'min' word_end
  / 
  'mins' word_end
  / 
  'm' word_end
end

rule pt_minute
  'minuto' word_end
  / 
  'minutos' word_end 
  / 
  'min' word_end
  / 
  'mins' word_end
  / 
  'm' word_end
end

rule hour
  (en_hour / pt_hour)
  {
    def hour?; true end
    def second?; false end
    def minute?; false end
  }
end

rule en_hour
  'hour' word_end
  / 
  'hours' word_end
  / 
  'h' word_end
end

rule pt_hour
  'hora' word_end
  / 
  'horas' word_end
  / 
  'h' word_end
end

rule loop
  'loop'
end

end