class Mogo
  
  def initialize(windows, options, logName)
    @windows = windows
    @log = File.new(logName, "w")
    @log.sync = true
    mogo = windows ? "mogo " : "./mogo "
    command = mogo << options << " 2>&1"
    @mogo = IO.popen(command, "w+")
    @rows = %w[A B C D E F G H J K L M N O P Q R S T U V W X Y Z]
  end
  
  def Command(command, *optionals)
    begin
      @log.puts "COMMAND>" << command
      if optionals.length > 0
        echo = optionals[0]
      else
        echo = true
      end
      if echo
        puts "MOGO>" << command
      end
      output = ""
      @mogo.puts command
      foundGtpReply = false
      done = false
      until done do
        line = @mogo.gets
        if echo
          puts line
        end
        if line == nil
          puts "MoGo died."
          raise "MoGo died."
        else
          @log.puts line
          output << line
          if line.slice(0,1) == "?"
            throw line
          elsif line.slice(0,1) == "="
            foundGtpReply = true
          elsif foundGtpReply && line.chomp.length == 0
            done = true
          end
        end
      end
      output
    rescue Exception
      puts "MoGo error: " + $!
    end
  end
  
  def NewGame(size, komi, *optionals)
    if optionals.length > 0
      echo = optionals[0]
    else
      echo = true
    end
    Command("boardsize #{size}", echo)
    Command("komi #{komi}", echo)
    Command("clear_board", echo)
    return nil
  end
  
  def GetMoveValues(size)
    moveValues = {}
    for row in (0..size - 1)
      for col in (1..size)
        coordinate = @rows[row] + col.to_s
        reply = Command("show_sequence " << coordinate, false)
        parts = reply.split("||")
        if parts.length > 1
          moveValues[coordinate] = parts[1].split("/")[0].to_i
        end
      end
    end
    return moveValues
  end
  
  def Kill()
    Command("quit", false)
  end
  
  def Evaluation
    Command("show_evaluation", false)[22,100].split("/")[0].to_f
  end
  
end
