desc 'Load Redmine default configuration data'

namespace :redmine do
task :load_default_data => :environment do
  include GLoc
  set_language_if_valid('en')
  puts
  
  while true
    print "Select language: "
    print GLoc.valid_languages.sort {|x,y| x.to_s <=> y.to_s }.join(", ")
    print " [#{GLoc.current_language}] "
    lang = STDIN.gets.chomp!
    break if lang.empty?
    break if set_language_if_valid(lang)
    puts "Unknown language!"
  end
    
  puts "===================================="
  
begin
  # check that no data already exists
  if Role.find(:first, :conditions => {:builtin => 0})
    raise "Some roles are already defined."
  end
  if Tracker.find(:first)
    raise "Some trackers are already defined."
  end
  if IssueStatus.find(:first)
    raise "Some statuses are already defined."
  end
  if Enumeration.find(:first)
    raise "Some enumerations are already defined."
  end
    
  puts "Loading default configuration data for language: #{current_language}"
 
  # roles
  manager = Role.create :name => l(:default_role_manager), 
                        :position => 1
  manager.permissions = manager.setable_permissions.collect {|p| p.name}
  manager.save
  
  developper = Role.create :name => l(:default_role_developper), 
                           :position => 2, 
                           :permissions => [:manage_versions, 
                                            :manage_categories,
                                            :add_issues,
                                            :edit_issues,
                                            :manage_issue_relations,
                                            :add_issue_notes,
                                            :change_issue_status,
                                            :save_queries,
                                            :view_gantt,
                                            :view_calendar,
                                            :log_time,
                                            :view_time_entries,
                                            :comment_news,
                                            :view_documents,
                                            :view_wiki_pages,
                                            :edit_wiki_pages,
                                            :delete_wiki_pages,
                                            :add_messages,
                                            :view_files,
                                            :manage_files,
                                            :browse_repository,
                                            :view_changesets]
  
  reporter = Role.create :name => l(:default_role_reporter),
                         :position => 3,
                         :permissions => [:add_issues,
                                          :add_issue_notes,
                                          :change_issue_status,
                                          :save_queries,
                                          :view_gantt,
                                          :view_calendar,
                                          :log_time,
                                          :view_time_entries,
                                          :comment_news,
                                          :view_documents,
                                          :view_wiki_pages,
                                          :add_messages,
                                          :view_files,
                                          :browse_repository,
                                          :view_changesets]
              
  Role.non_member.update_attribute :permissions, [:add_issues,
                                                  :add_issue_notes,
                                                  :change_issue_status,
                                                  :save_queries,
                                                  :view_gantt,
                                                  :view_calendar,
                                                  :view_time_entries,
                                                  :comment_news,
                                                  :view_documents,
                                                  :view_wiki_pages,
                                                  :add_messages,
                                                  :view_files,
                                                  :browse_repository,
                                                  :view_changesets]

  Role.anonymous.update_attribute :permissions, [:view_gantt,
                                                 :view_calendar,
                                                 :view_time_entries,
                                                 :view_documents,
                                                 :view_wiki_pages,
                                                 :view_files,
                                                 :browse_repository,
                                                 :view_changesets]
                                                   
  # trackers
  Tracker.create(:name => l(:default_tracker_bug), :is_in_chlog => true, :is_in_roadmap => false, :position => 1)
  Tracker.create(:name => l(:default_tracker_feature), :is_in_chlog => true, :is_in_roadmap => true, :position => 2)
  Tracker.create(:name => l(:default_tracker_support), :is_in_chlog => false, :is_in_roadmap => false, :position => 3)
  
  # issue statuses
  new       = IssueStatus.create(:name => l(:default_issue_status_new), :is_closed => false, :is_default => true, :position => 1)
  assigned  = IssueStatus.create(:name => l(:default_issue_status_assigned), :is_closed => false, :is_default => false, :position => 2)
  resolved  = IssueStatus.create(:name => l(:default_issue_status_resolved), :is_closed => false, :is_default => false, :position => 3)
  feedback  = IssueStatus.create(:name => l(:default_issue_status_feedback), :is_closed => false, :is_default => false, :position => 4)
  closed    = IssueStatus.create(:name => l(:default_issue_status_closed), :is_closed => true, :is_default => false, :position => 5)
  rejected  = IssueStatus.create(:name => l(:default_issue_status_rejected), :is_closed => true, :is_default => false, :position => 6)
  
  # workflow
  Tracker.find(:all).each { |t|
    IssueStatus.find(:all).each { |os|
      IssueStatus.find(:all).each { |ns|
        Workflow.create(:tracker_id => t.id, :role_id => manager.id, :old_status_id => os.id, :new_status_id => ns.id) unless os == ns
      }        
    }      
  }
  
  Tracker.find(:all).each { |t|
    [new, assigned, resolved, feedback].each { |os|
      [assigned, resolved, feedback, closed].each { |ns|
        Workflow.create(:tracker_id => t.id, :role_id => developper.id, :old_status_id => os.id, :new_status_id => ns.id) unless os == ns
      }        
    }      
  }
  
  Tracker.find(:all).each { |t|
    [new, assigned, resolved, feedback].each { |os|
      [closed].each { |ns|
        Workflow.create(:tracker_id => t.id, :role_id => reporter.id, :old_status_id => os.id, :new_status_id => ns.id) unless os == ns
      }        
    }
    Workflow.create(:tracker_id => t.id, :role_id => reporter.id, :old_status_id => resolved.id, :new_status_id => feedback.id)
  }

  # enumerations
  Enumeration.create(:opt => "DCAT", :name => l(:default_doc_category_user), :position => 1)
  Enumeration.create(:opt => "DCAT", :name => l(:default_doc_category_tech), :position => 2)

  Enumeration.create(:opt => "IPRI", :name => l(:default_priority_low), :position => 1)
  Enumeration.create(:opt => "IPRI", :name => l(:default_priority_normal), :position => 2, :is_default => true)
  Enumeration.create(:opt => "IPRI", :name => l(:default_priority_high), :position => 3)
  Enumeration.create(:opt => "IPRI", :name => l(:default_priority_urgent), :position => 4)
  Enumeration.create(:opt => "IPRI", :name => l(:default_priority_immediate), :position => 5)

  Enumeration.create(:opt => "ACTI", :name => l(:default_activity_design), :position => 1)
  Enumeration.create(:opt => "ACTI", :name => l(:default_activity_development), :position => 2)
 
rescue => error
  puts "Error: " + error
  puts "Default configuration data can't be loaded."
end
end
end
