#!/usr/bin/env ruby
#
# $Id: mycal,v 1.12 2002/09/25 15:45:39 ianmacd Exp $
#
# simple program to retrieve one's calendar entries for the coming seven days
#
# Copyright (C) 2002 Ian Macdonald
#
#   This program is free software; you can redistribute it and/or modify
#   it under the terms of the GNU General Public License as published by
#   the Free Software Foundation; either version 2, or (at your option)
#   any later version.
#
#   This program is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#   GNU General Public License for more details.
#
#   You should have received a copy of the GNU General Public License
#   along with this program; if not, write to the Free Software Foundation,
#   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

begin
  require 'password'
rescue LoadError
  $stderr.puts "This program requires Ruby/Password: http://www.caliban.org/ruby/"
  exit 1
end

require 'ctime'
require 'date'

server = nil
user = nil
passwd = nil

dot_mycal = ENV['HOME'] + '/.mycal'
if FileTest.readable?(dot_mycal)
  File.open(dot_mycal) do |file|
    while line = file.gets
      eval line
    end
  end
end

if server.nil?
  $stderr.puts "Please define a CorporateTime server either in line 33 of this",
	       "program or in a ~/.mycal file."
  exit 1
end

user ||= ( print "Username: "; gets.chomp ) 
passwd ||= Password.new(Password.getc("Calendar password"))

now = Time.now.gmtime
today = Date.today
in_a_week = today + 7

start_date = sprintf("%s%02d%02dT%02d%02d00Z",
		     today.year, today.month, today.day, now.hour, now.min)
end_date = sprintf("%s%02d%02dT%02d%02d00Z",
		   in_a_week.year, in_a_week.month, in_a_week.day,
		   now.hour, now.min)

ct = CTime.new(server, user, passwd)

unless ct.error == "CAPI_STAT_OK"
  printf("Failed to connect to %s as user %s\n", server, user)
  exit 2
end

ct.open_agenda(user)
events = ct.get_events(start_date, end_date)

puts "Calendar for user #{user}:\n\n"

events.sort {|a,b| a.start <=> b.start}.each do |e|

  year, month, day, hours, mins, secs =
    /^(\d{4})(\d\d)(\d\d)T(\d\d)(\d\d)(\d\d)Z$/.match(e.start)[1..6]
  start_time = Time.gm(year, month, day, hours, mins, secs)

  d_hours, d_mins, d_secs = /^P\dDT(\d+)H(\d+)M(\d+)S$/.match(e.duration)[1..3]
  end_time = start_time + d_hours.to_s.to_i * 3600 + d_mins.to_s.to_i * 60 +
	     d_secs.to_s.to_i

  start_time.localtime
  end_time.localtime

  printf("%s until %s\n", start_time.strftime("%A, %B %d, %Y at %H:%M"),
	 end_time.strftime("%H:%M"))
  printf("  %s\n", e.summary.sub(/=20$/, '')) unless e.summary.nil?

  unless e.description.nil?
    e.description.gsub!(/\\n/, "\n")
    e.description.gsub!(/\\,/, ',')
    printf("  %s\n", e.description)
  end

  printf("  %s\n", e.location.sub(/=20$/, '')) unless e.location.nil?
  puts
end

ct.quit
