namespace :db do
  desc 'Populate database with fake data for development'
  task :populate => [ 'db:seed', 'db:populate:create' ]

  namespace :populate do

    desc "Reload populate data"
    task :reload => [ 'db:reset', :create ]

    desc "Create populate data"
    task :create => :environment do

      LOGOS_PATH = File.join(Rails.root, 'lib', 'logos')

      def set_logos(klass)
        klass.all.each do |i|
          logo = Dir[File.join(LOGOS_PATH, klass.to_s.tableize, "#{ i.id }.*")].first

          if logo.present? && File.exists?(logo)
            i.logo = File.new(logo)
            i.logo.reprocess!
            i.save!
          end
        end
      end

      # = Users

      # Create demo user if not present
      if User.find_by_name('demo').blank?
        User.create! :name => 'Demo',
                     :email => 'demo@social-stream.dit.upm.es',
                     :password => 'demonstration',
                     :password_confirmation => 'demonstration'
      end

      require 'forgery'

      9.times do
        User.create! :name => Forgery::Name.full_name,
                     :email => Forgery::Internet.email_address,
                     :password => 'demonstration',
                     :password_confirmation => 'demonstration'
      end

      set_logos(User)

      # = Groups
      available_actors = Actor.all

      10.times do
        founder = available_actors[rand(available_actors.size)]

        Group.create :name  => Forgery::Name.company_name,
                     :email => Forgery::Internet.email_address,
                     :_founder => founder.permalink
      end

      set_logos(Group)

      # Reload actors to include groups
      available_actors = Actor.all

      # = Ties
      available_actors.each do |a|
        actors = available_actors.dup - Array(a)
        relations = a.relations

        Forgery::Basic.number(:at_most => actors.size).times do
          actor = actors.delete_at((rand * actors.size).to_i)
          a.sent_ties.create :receiver => actor,
                             :relation => relations.random
        end
      end

      # = Posts

      SocialStream::Populate.power_law(Tie.all) do |t|
        updated = Time.at(rand(Time.now))

        p = Post.create :text =>
                      "This post should be for #{ t.relation.name } of #{ t.sender.name }.\n#{ Forgery::LoremIpsum.paragraph(:random => true) }",
                        :created_at => Time.at(rand(updated)),
                        :updated_at => updated,
                        :_activity_tie_id => t.id

        p.post_activity.update_attributes(:created_at => p.created_at,
                                          :updated_at => p.updated_at)
      end
    end
  end
end