#! /usr/bin/perl
use strict;
use IO::Socket;
use Time::HiRes qw(usleep) ;

my $prfx = "" ;
my $server_port = 30363 ;
if ( $#ARGV >= 0) {
    $prfx = "$ARGV[0]  " ;
}
if ( $#ARGV >= 1) {
    $server_port = $ARGV[1] ;
}


my $max_line = 256 ;
my $host = "candler.cs.unca.edu" ;
my $sock = IO::Socket::INET->new(PeerAddr => $host,
				 PeerPort => $server_port,
				 Proto => 'tcp') ;
die "Unable to connect to port ${server_port}" unless $sock ;

my $line = <$sock> ;
print "${prfx}Opening line:  ${line}" ;

if ($line eq "Choose a number from 1000 to 9999\r\n") {
##  print "Opening line matches\n" ;
} elsif ($line eq "Choose a number from 1000 to 9999\n") {
    print "${prfx}Opening line missing \\r\n" ;
} else {
    print "${prfx}Opening line does not match\n" ;
}

my $loend = 1000 ;
my $hiend = 9999 ;
my $done = 0 ;
my $numguess = 0 ;

while (!$done) {
    my $guess = int((2*$loend + $hiend)/3) ;
    print "${prfx}Sending my guess -- ${guess}\n" ;
    print $sock "${guess}\r\n" ;
    usleep(250000) ;
    ++$numguess ;
    $line = <$sock> ;
    print "${prfx}Response:  ${line}" ;
    my $response ;
##
##
##                response>0        response<0
##             |-------------*-------------------------|
##           loend         guess                   hiend
##
    if ($line eq "Too big, try again.\r\n") {
##	print "Response line OK\n" ;
	$response = 1 ;
    } elsif ($line eq "Too big, try again.\n") {
	print "${prfx}Response missing \\r\n" ;
	$response = 1 ;
    } elsif ($line =~ /^.*big.*$/) {
	print "${prfx}Response improper -- assuming too big\n" ;
	$response = 1 ;
    } elsif ($line eq "Too little, try again.\r\n") {
##	print "Response line OK\n" ;
	$response = -1 ;
    } elsif ($line eq "Too litte, try again.\n") {
	print "${prfx}Response missing \\r\n" ;
	$response = -1 ;
    } elsif ($line =~ /^.*little.*$/) {
	print "${prfx}Response improper -- assuming too little\n" ;
	$response = -11 ;
    } elsif ($line =~ /^Correct! You guessed in \d+ attempts. Goodbye.\r\n$/) {
##	print "Response line OK\n" ;
	$response = 0 ;
    } elsif ($line =~ /^Correct! You guessed in \d+ attempts. Goodbye.\n$/) {
	print "${prfx}Response missing \\r\n" ;
	$response = 0 ;
    } elsif ($line =~ /^.*in\s+\d+\s+attempts.*$/) {
	print "${prfx}Response improper -- assuming just right\n" ;
	$response = 0 ;
    } elsif ($line =~ /^I said a number from.*$/) {
	print "${prfx}Server misunderstood valid input\n" ;
	exit(1) ;
    } else {
	print "${prfx}Can't parse server response\n" ;
	exit(1) ;
    }
    if (($loend == $hiend && $response != 0)
	|| ($loend == $guess && $response > 0)
	|| ($hiend == $guess && $response < 0)) {
	print "${prfx}Server isn't playing by the rules\n" ;
	exit(1) ;
    }
    if ($response < 0) {
	$loend = $guess+1 ;
    } elsif ($response > 0) {
	$hiend  = $guess-1 ;
    } else {
	my $itscount ;
	( $itscount ) = ($line =~ /^.*in\s+(\d+)\s+attempts.*$/) ;
	if ($itscount == $numguess) {
	    print "${prfx}Server count is correct\n" ;
	} else {
	    print "${prfx}Server count is ${itscount}, should be ${numguess}\n" ;
	}
	exit(0) ;
    }
	
}
