$: << File.join(File.dirname(__FILE__), 'lib')
require 'rubygems'
require 'rake/gempackagetask'
# If this require failes, try "gem install rspec"
require 'spec/rake/spectask'
require 'time'

file_list = FileList['spec/*_spec.rb']

Spec::Rake::SpecTask.new('spec') do |t|
  t.spec_files = file_list
end

desc 'Default: run specs.'
task :default => 'spec'

desc "cron task for keeping the CAN updated.  Run once every hour."
task :cron => 'seinfeld:init' do
  if Time.now.hour % 4 == 0
    Seinfeld::User.paginated_each do |user|
      user.update_progress
    end
  end
end

namespace :seinfeld do
  task :init do
    $: << File.join(File.dirname(__FILE__), 'lib')
    require 'seinfeld/models'
    require 'seinfeld/calendar_helper'
    require File.dirname(__FILE__) + '/config/seinfeld.rb'
  end

  desc "Initial setup."
  task :setup => :init do
    DataMapper.auto_migrate!
    puts "Database reset"
  end

  desc "Inspect USER."
  task :show => :init do
    raise "Need USER=" if ENV['USER'].to_s.size.zero?
    u = Seinfeld::User.first(:login => ENV['USER'])
    puts "#{u.login}#{" #{u.time_zone}" if u.time_zone}"
    puts "Current Streak: #{u.current_streak} #{u.streak_start} => #{u.streak_end}"
    puts "Longest Streak: #{u.longest_streak} #{u.longest_streak_start} => #{u.longest_streak_end}"
  end

  desc "Sets USER's timezone to ZONE."
  task :tz => :init do
    raise "Need USER=" if ENV['USER'].to_s.size.zero?
    raise "Need ZONE=" if ENV['ZONE'].to_s.size.zero?
    zone = ActiveSupport::TimeZone::MAPPING[ENV['ZONE']] || ActiveSupport::TimeZone::MAPPING.index(ENV['ZONE']) || raise("Bad Time Zone")
    u = Seinfeld::User.first(:login => ENV['USER'])
    u.time_zone = zone
    u.save
  end

  desc "Add a USER to the database."
  task :add => :init do
    raise "Need USER=" if ENV['USER'].to_s.size.zero?
    Seinfeld::User.create(:login => ENV['USER'])
  end

  desc "Remove a USER from the database."
  task :drop => :init do
    raise "Need USER=" if ENV['USER'].to_s.size.zero?
    Seinfeld::User.first(:login => ENV['USER']).destroy
  end
  
  desc "Update the calendar of USER"
  task :update => :init do
    if ENV['USER'].to_s.size.zero?
      Seinfeld::User.paginated_each do |user|
        user.update_progress
      end
    else
      user = Seinfeld::User.first(:login => ENV['USER'])
      if user
        user.update_progress
      else
        raise "No user found for #{ENV['USER'].inspect}"
      end
    end
  end

  desc "Clear progress of USER."
  task :clear => :init do
    raise "Need USER=" if ENV['USER'].to_s.size.zero?
    Seinfeld::User.first(:login => ENV['USER']).clear_progress
  end

  desc "Resets progress of USER."
  task :reset => :init do
    raise "Need USER=" if ENV['USER'].to_s.size.zero?
    Seinfeld::User.first(:login => ENV['USER']).reset_progress
  end
end