#!@OOREXX_SHEBANG_PROGRAM@
/*----------------------------------------------------------------------------*/
/*                                                                            */
/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved.             */
/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved.    */
/*                                                                            */
/* This program and the accompanying materials are made available under       */
/* the terms of the Common Public License v1.0 which accompanies this         */
/* distribution. A copy is also available at the following address:           */
/* https://www.oorexx.org/license.html                         */
/*                                                                            */
/* Redistribution and use in source and binary forms, with or                 */
/* without modification, are permitted provided that the following            */
/* conditions are met:                                                        */
/*                                                                            */
/* Redistributions of source code must retain the above copyright             */
/* notice, this list of conditions and the following disclaimer.              */
/* Redistributions in binary form must reproduce the above copyright          */
/* notice, this list of conditions and the following disclaimer in            */
/* the documentation and/or other materials provided with the distribution.   */
/*                                                                            */
/* Neither the name of Rexx Language Association nor the names                */
/* of its contributors may be used to endorse or promote products             */
/* derived from this software without specific prior written permission.      */
/*                                                                            */
/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS        */
/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT          */
/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS          */
/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT   */
/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,      */
/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED   */
/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,        */
/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY     */
/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING    */
/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS         */
/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.               */
/*                                                                            */
/*----------------------------------------------------------------------------*/
/******************************************************************************/
/*  qtime.rex           Open Object Rexx Samples                              */
/*                                                                            */
/* -------------------------------------------------------------------------- */
/*                                                                            */
/* Description:                                                               */
/* Displays or in real English                                                */
/******************************************************************************/

   -- get the current time
   time = .EnglishTime~new
   say time~englishTime

-- create a subclass of date time that can express the time as an English statement
::class "EnglishTime" subclass DateTime
-- Return the time as a value in English
::method englishTime
   expose chimeCount

   chime = 0        -- we only chime at particular boundaries

   hourNames = .array~of("one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve")

   ot="It's"

   hr = self~hours            -- get the time specifics
   mn = self~minutes
   sc = self~seconds

   if sc>29 then mn=mn+1      -- round up the minutes if we're more than halfway there
   if mn>32 then hr=hr+1      -- if in the later half of the hour, express this as "to" the next hour

   mod=mn//5                  -- find the 5-minute bracket
   select
     when mod=0 then nop      -- exact
     when mod=1 then ot=ot 'just gone'
     when mod=2 then ot=ot 'just after'
     when mod=3 then ot=ot 'nearly'
     when mod=4 then ot=ot 'almost'
     end

   mn=mn+2                    -- round up a bit
   if hr//12=0 & mn//60<=4    -- if within 4 minutes of noon or midnight
    then return ot self~midnoon(hr, mn)  -- handle as special special case
   mn=mn-(mn//5)              -- to nearest 5 mins
   if hr>12
    then hr=hr-12             -- get rid of 24-hour clock
    else
     if hr=0 then hr=12       -- cater for midnight

   select
     when mn=0  then nop      -- add O'clock later --
     when mn=60 then mn=0
     when mn= 5 then ot=ot 'five past'
     when mn=10 then ot=ot 'ten past'
     when mn=15 then ot=ot 'a quarter past'
     when mn=20 then ot=ot 'twenty past'
     when mn=25 then ot=ot 'twenty-five past'
     when mn=30 then ot=ot 'half past'
     when mn=35 then ot=ot 'twenty-five to'
     when mn=40 then ot=ot 'twenty to'
     when mn=45 then ot=ot 'a quarter to'
     when mn=50 then ot=ot 'ten to'
     when mn=55 then ot=ot 'five to'
   end

   ot=ot hourNames[hr]           -- add the hour number
   if mn=0 then ot=ot "o'clock"  -- and O'clock if exact
   ot=ot'.'                      -- and the correct punctuation

   return ot||self~chime(hr, mod, mn)  -- add on a chime if appropriate

-- Special-case Midnight and Noon
::method midNoon private
  use arg hr, mn

  -- we must be on a real 15-minute boundary to add a chime

  -- set up the chime value, if exactly at midnight
  chime = ""
  if mn//60 = 2 then chime = self~chime(12, 0, 0)

  if hr = 12 then return 'Noon.'||chime
           else return 'Midnight.'||chime

-- add on a chime value for this time
::method chime
  use arg hr, mod, mn

  if mod \= 0 | mn // 15 \= 0 then return ""

  -- hourly chime
  if mn // 60 = 0 then  do
     chime='Bong'
     num=hr
  end
  -- quarterly tinkles
  else do
     chime='Ding-Dong'
     num = mn % 15
   end
   -- parens and first chime
   ot = ' ('chime
   loop num - 1
   -- add remainder of chiming sounds
     ot=ot||',' chime
   end
   ot=ot||'!)'      -- ... and final punctuation and parenthesis
   return ot