#!/usr/bin/ruby -w

require 'src/play'
require 'src/selection'
# require 'systemu'

pop = Population.new(5, 20)
generation_count = 1
max_generations = 3

if File.file? 'player.log'
  File.delete 'player.log'
end

puts "Generation number #{generation_count}"
pop.individuals.sort {|x, y| x.genome <=> y.genome}.each {|i| puts "#{i.genome}"}

while generation_count <= max_generations 
  start = Time.now
  puts "Started at #{start}"
  
  new_population = []
  threads = []
  1.upto(pop.individuals.length) do |i|
    threads << Thread.new do
      puts "Starting thread #{i}"
      sleep 2
      player_count = rand(5) + 2
      pool_size = pop.individuals.length
      players = []
      1.upto(player_count) { players << pop.individuals[rand(pool_size)] }
      IO.popen('ruby play-one-game.rb', 'r+') do |pipe|
        players.each {|p| pipe << "#{p.genome}\n" ; puts "Game #{i}: putting player #{p.genome}"}
#        players.each {|p| pipe << "#{p.genome}\n"}
        pipe.close_write
        new_population << Genome.new(pipe.readline.chomp.split(//).collect {|x| x.to_i})
        puts "Got result #{new_population[-1].genome}"
      end
#      game_input = (players.collect {|p| p.genome.to_s}).join("\n")
#      game_result = ''
#      puts "Calling game #{i} with input #{game_input}"
#      status, game_result, stderr = systemu 'ruby play-one-game.rb', 'stdin' => game_input
#      puts "Game #{i} returned #{game_result}"
#      new_population << Genome.new(game_result.chomp.split(//).collect {|x| x.to_i})
    end
    threads.each {|t| t.join}
  end
  
  pop.individuals = new_population
  
  finish = Time.now
  puts "Took #{finish - start} seconds"
  pop1 = pop.crossover(0.7)
  pop  = pop1.mutation(0.05)
  generation_count += 1
  puts "Generation number #{generation_count}"
  pop.individuals.sort {|x, y| x.genome <=> y.genome}.each {|i| puts "#{i.genome}"}
  $stdout.flush
end