use File::Temp "tempfile";

sub scoreFile {
    my($xferfile, $reference) = @_;

    my $sysid = "cmu_xfer";

    #print "files $xferfile $reference $sysid\n";
    if ($xferfile =~ m/sgm$/) {
	$hypfile = $xferfile;
    } else {
	$hypfile = &makeTestSet($xferfile, $reference, $sysid);

	if ($xferfile !~ m/\.sgm$/) {
	    $sgmfile = $xferfile;
	    $sgmfile =~ s/\.[^\.]+$/.sgm/;
	    `cp $hypfile $sgmfile`;
	}
    }

    
    my $meteorscore = &meteorScore($hypfile, $reference, $sysid);
    my $bleuscore = &bleuScore($hypfile, $reference, $sysid);
    #my $terscore = &terScore($hypfile, $reference, $sysid);

    print "FILE\tMETEOR\tBLEU\n";
    print "$xferfile\t$meteorscore\t$bleuscore\t$terscore\n";

    unlink $hypfile if $hypfile ne $xferfile;
}



sub meteorScore {
    my($hypfile, $reference, $sysid) = @_;
    my ($meteor, $line);
    my ($meteordir) = "/barrow/usr1/shared/code/meteor-0.5.1";
    # METEOR
    my $meteorcommand = "perl -I$meteordir $meteordir/meteor.pl -s $sysid -r $reference -t $hypfile --modules \"exact porter_stem\" --noStop 2> /dev/null |";
    #print "METEOR: $meteorcommand\n";
    open(SCORE, $meteorcommand) or die $!;
    while ($line = <SCORE>) {
	#print "$line";
	if ($line =~ m/^Score,(.*)$/ or $line =~ m/^Score: (.*)$/) {
	    $meteor = $1;
	    if (length($meteor) > 6) {
		$meteor = substr($meteor, 0, 6);
	    }
	}
    }
    close(SCORE);
    $meteor =~ s/^\s*//;
    $meteor =~ s/\s*$//;
    return $meteor;
}

sub bleuScore {
    my($hypfile, $reference, $sysid) = @_;
    my ($bleu, $modified, $line);
    # Bleu
    #my $bleuscript = "/afs/cs.cmu.edu/usr/joy/Eval/evaluationScripts/bleuv09/bleu-v09e.pl";
    my $bleuscript = "/afs/cs.cmu.edu/usr/joy/Eval/evaluationScripts/bleu-v1.04/bleu-1.04.pl";
    # "$evalRoot/nist-v11/mteval-v11a-cmufix_b.pl"
    my $command = "perl $bleuscript -r $reference -t $hypfile ";
    #print "BLEU $command\n";
    open(SCORE, "perl $bleuscript -r $reference -t $hypfile 2> /dev/null |") or die $!;
    while ($line = <SCORE>) {
	if ($line =~ m/^BLEU\w*,/) {  
	    $line =~ m/^BLEU\w*,(.+)$/;
	    $bleu = $1;
	    #print $line;
	    
	} elsif ($line =~ m/^Modified/) {
	    $line =~ m/^Modified BLEU,(.+)$/;
	    $modified = $1;
	    #print $line;
	}
    }
    close(SCORE);

    return "$bleu";
}


sub terScore {
    my($hypfile, $reference, $sysid) = @_;

    my $scorer = "/afs/cs.cmu.edu/usr/joy/Eval/evaluationScripts/ter/tercom_v5.pl";
    my $tercommand = "$scorer -h $hypfile -r $reference -i sgm";
    #print $tercommand, "\n";
    print `$tercommand`;

    my $terscore =  `cat $hypfile.sys.sum`;
    $terscore =~ m/(\S+)$/;
    $terscore = $1;
    #print "TER score $terscore\n";
    unlink "$hypfile.sys.sum", "$hypfile.sys.pra";

    return $terscore;

}

sub postProcess {
    my $seg = shift;
    $seg =~ s/\\//g;
    $seg =~ s/\s+\'s/\'s/g;
    $seg =~ s/\s+n\'t/n\'t/g;
    $seg =~ s/\s+;/;/g;
    $seg =~ s/\s+:/:/g;
    $seg =~ s/\s+,/,/g;
    $seg =~ s/\s+\././g;
    $seg =~ s/\(\s+/\(/g;
    $seg =~ s/\s+\)/\)/g;
    $seg =~ s/[\x0-\x19]/ /g;
    $seg =~ s/[\x80-\xff]/ /g;
    $seg =~ s/^\s*([a-z])/uc($1)/e;

    return $seg;
}

sub makeTestSet {
    my($srcfile, $srcset, $sysid) = @_;
    my($line, $seg);
    my(@segs);


    open(TGT, $srcfile) or die $!;
    $line = <TGT>; $line =~ s/[\r\n]*$//;
    if ($line =~ m/^SrcSent/) {  # Handle n-best
	while ($line = <TGT>) {
	    $line =~ s/[\r\n]*$//;
	    if ($line =~ m/^\d+\s0\t(.*)$/) {
		$seg = $1;
		$seg = &postProcess($seg);
		push @segs, $seg;
	    }
	}
	
    } else {
	push @segs, $line;
	while ($line = <TGT>) {
	    $line =~ s/[\r\n]*$//;
	    $seg = $line;
	    $seg = &postProcess($seg);
	    push @segs, $seg;
	}
    }
    close(TGT);
    
#print STDERR "Translation count: " .  scalar(@segs) . "\n";
    my($tmpdir) = "/tmp";
    my ($hypfd, $hypfile) = tempfile("hypfileXXXXXX",
				     DIR => $tmpdir,
				     SUFFIX => '.sgm');

    %stopwords = ("of", 1, "at", 1, "in", 1, "for", 1, "the", 1, "a", 1, "an", 1, "or", 1, "and", 1,
		  "but", 1, "nor", 1, "to", 1, "up", 1);
    
    $segindex = 0;
    open(TST, $srcset) or die $!;
    while ($line = <TST>) {
	$line =~ s/refset/tstset/;
	$line =~ s/srcset/tstset/;
	$line =~ s/\s+tgtlang=\"[^\"]*\"//;
	$line =~ s/\s+trglang=\"[^\"]*\"//;
	$line =~ s/sysid=\"([^\"]+)\"/sysid=\"$sysid\"/i;
	if ($line =~ m/<seg/) {
	    if ($isheadline) {
		@words = split(/\s+/, $segs[$segindex]);
		for ($wi = 0; $wi < @words; $wi++) {
		    if (!defined($stopwords{$words[$wi]})) {
			$words[$wi] =~ s/^\s*([a-z])/uc($1)/e;
		    }
		}
		$segs[$segindex] = join(" ", @words);
	    }
	    $line =~ s/>[^<]*</"> " . $segs[$segindex] . " <"/e;
	    $isheadline = 0;
	    $segindex++;
	    print $hypfd $line;
	} elsif ($line =~ m/<h1>/g or $line =~ m/<hl>/g) {
	    $isheadline = 1;
	    print $hypfd $line;
	} elsif ($line =~ m/<DOC\b/i) {
	    if ($line =~ m/docid\s*=\"([^\" >]+)\"/) {
		$docid = $1;
		if (defined($seen{$docid})) {
		    while ($line = <TST>) {
			last if $line =~ m/<\/doc>/i;
		    }
		} else {
		    #print "Doc id $docid\n";
		    $seen{$docid} = 1;
		    $line =~ s/ sysid=\"[^\"]*\"//;
		    $line =~ s/>/ sysid=\"$sysid\">/;
		    print $hypfd $line;
		}
	    }
	} else {
	    print $hypfd $line;
	}
    }
    close(TST);

    close($hypfd);
    return $hypfile;

}


# sub makeTestSet {
#     open(TGT, $srcfile) or die $!;
#     $line = <TGT>; $line =~ s/[\r\n]*$//;
#     if ($line =~ m/^SrcSent/) {  # Handle n-best
# 	while ($line = <TGT>) {
# 	    $line =~ s/[\r\n]*$//;
# 	    if ($line =~ m/^\d+\s0\t(.*)$/) {
# 		push @segs, $1;
# 	    }
# 	}
	
#     } else {
# 	push @segs, $line;
# 	while ($line = <TGT>) {
# 	    $line =~ s/[\r\n]*$//;
# 	    push @segs, $line;
# 	}
#     }
#     close(TGT);
    
#     $segindex = 0;
#     open(TST, $srcset) or die $!;
#     while ($line = <TST>) {
# 	$line =~ s/refset/tstset/;
# 	$line =~ s/srcset/tstset/;
# 	$line =~ s/\s+tgtlang=\"[^\"]*\"//;
# 	if ($line =~ m/<seg/) {
# 	    $line =~ s/>[^<]*</"> " . $segs[$segindex] . " <"/e;
# 	    $segindex++;
# 	    print $line;
# 	} elsif ($line =~ s/sysid=\"([^\"]+)\"/sysid=\"$sysid\"/i) {
# 	    #$line =~ s/>/ sysid=\"$sysid\">/;
# 	    print $line;
# 	} elsif ($line =~ m/<DOC/i) {
# 	    $line =~ s/ sysid=\"[^\"]*\"//;
# 	    $line =~ s/>/ sysid=\"$sysid\">/;
# 	    print $line;
# 	} else {
# 	    print $line;
# 	}
#     }
#     close(TST);


# }

1;
