#!/usr/pd/tk/bin/tclsh 
# CHANGE: The row above must be set to find your tclsh!

#
# Script to extract data from galaxy files stored by mailreceiver
#
# Written by Tomas Aronsson, d0malaga@dtek.chalmers.se
# last rev 941208

set dir $env(HOME)

set reportanalyzer $dir/.mailreceiver
set resourcefile $dir/.galaxyrsc

#
# Procedures to be used by main script
#

# Splitline: Splits a string into substrings, tabs & spaces are delimiters
#
# In:  String to be splitted into substrings
# Out: List of substrings
#

proc splitline instring {
	set inlist [split $instring];
	foreach s1 $inlist {
		if [string compare "$s1" ""] {
			lappend outlist $s1;
		}
	}
	return $outlist;
}


# Buildline: builds a string by inserting \tab as delimiter between substrings
#
# In:  List of substrings
# Out: New string with substrings separated with tabs
#

proc buildline inlist {
	set outstring "";
	foreach s1 $inlist {
		lappend outstring $s1;
#		lappend outstring "  \t";
		lappend outstring " ";
	}
	return [join $outstring];
}

#
# Main script
#

if [expr $argc > 0] {
    set status [lindex $argv 0];
} else {
    set status help
}


# Change to next entry in .galaxyrsc, ie scan new datafiles

if [expr ![string compare $status "next_game"]] {
    set t1 [split [exec cat $resourcefile] \012];
    if [expr [llength $t1] == 1] {
	puts "Only one game in $resourcefile" 
	exit 0;
    }
    set t2 [lindex $t1 0];
    set t1 [lreplace $t1 0 0];
    lappend t1 $t2;
    puts "Rewriting $resourcefile";
    set filep [open $resourcefile w];
    foreach s1 $t1 {
	puts $filep $s1;
    }
    close $filep;
    exit 0;
}

# Get all args, build a list with one entry for each option

set opts none;
set opt1 {};
for {set i 1} {$i<$argc} {incr i} {
    set t1 [lindex $argv $i];
    if [expr ![string compare [string index $t1 0] "-"]] {
	if [llength $opt1] {
	    lappend opts $opt1;
	}
	set opt1 $t1;
    } else {
	lappend opt1 $t1;
    }
}
if [llength $opt1] {
    lappend opts $opt1;
}

# Read galaxydata, always take first entry in .galaxyrsc

set t1 [split [exec cat $resourcefile] \012];
set dir [lindex [splitline [lindex $t1 0]] 0]; 
set galaxysize [lindex [splitline [lindex $t1 0]] 1]; 

# Now, we know enough to write help message

if [expr ![string compare $status "help"]] {
    puts "$argv0\012";
    puts "   ggrep currently scans the galaxy data files for:";
    puts "   $dir";
    puts "\012ggrep <next_game>";
    puts "\012ggrep <planets>";
    puts "     -d\[ist\] \[min-\]\[max\] \[from planet\]";
    puts "     -s\[maller\] size";
    puts "     -b\[igger\] size";
    puts "     -o\[wner\] \[playername\]";
    puts "     -v\[isitor\] \[playername\]";
    puts "     -f\[ormat\] format string, %d is replaced by planets"
    puts "\012ggrep <players>";
    puts "\012ggrep <battles>";
    puts "\012ggrep <report>";
    puts "\012ggrep <groups>";
    puts "     -n\[ame\] shipname"
    puts "     -d\[ist\] \[min-\]\[max\] \[from planet\]"
    puts "     -m\[ass\] minmass"
    puts "     -\[no\]w\[eapon\]"
    puts "     -\[no\]s\[ield\]"
    puts "     -\[no\]c\[argo\]"
    puts "     -f\[ormat\] format string, %d is replaced by group #"
    puts "\012ggrep <ships>"
    puts "     -n\[ame\] playername"
    puts "     -m\[ass\] minmass"
    puts "     -w\[eapon\] minweapon"
    puts "     -sh\[ield\] minshield"
    puts "     -sp\[eed\] minspeed"
    puts "\012";
    puts "Written by Tomas Aronsson 1994";
    puts "           d0malaga@dtek.chalmers.se";
    puts "\012last rev 941119";
    exit 0;
}

# Read accumulated data for game

if [expr ![file readable $dir]] {
    puts "\012You don't have access to this game's data, type ggrep next_game to change\012";
    exit 1;
}

set planetdata [lreplace [split [exec cat $dir/reports/planets] \012] 0 0]
set playerdata [lreplace [split [exec cat $dir/reports/players] \012] 0 0]
set battledata [lreplace [split [exec cat $dir/reports/battles] \012] 0 0]
set shipdata [lreplace [split [exec cat $dir/reports/ships] \012] 0 0]
set a 0

# Some options should be prepared

foreach opt1 $opts {
    case [lindex $opt1 0] {
	{-d -dist} {
	    set mind 0;
	    set maxd 20;
	    if [expr [llength $opt1] > 1] {
		set t1 [string first "-" [lindex $opt1 1]];
		if [expr $t1 == -1] {
		    set maxd [lindex $opt1 1];
		} else {
		    set mind [string range [lindex $opt1 1] 0 [expr $t1 - 1]];
		    if [expr ($t1+1) < [string length [lindex $opt1 1]]] {
			set maxd [string range [lindex $opt1 1] [expr $t1 + 1] end];
		    } else {
			set maxd $galaxysize;
		    }
		}
	    }    
	    if [expr [llength $opt1] > 2] {
		set t1 [lindex $planetdata [lindex $opt1 2]];
		set orgx [lindex $t1 1];
		set orgy [lindex $t1 2];
	    } else {
		set orgx 0.0;
		set orgy 0.0;
	    }    
	}
	{-f -format} {
	    set formatstr [lindex $opt1 1];
	}
    }
}

switch $status {

    planets {
	foreach row $planetdata {
	    set got_planet 0;
	    foreach opt1 $opts {
		case [lindex $opt1 0] {
		    none { set got_planet 1}
		    {-d -dist} {
			set t1 [splitline $row];
			set dx [expr abs([lindex $t1 1] - $orgx)];
			set dy [expr abs([lindex $t1 2] - $orgy)];
			if [expr $dx > $galaxysize/2] {
			    set dx [expr abs($dx - $galaxysize)];
			}
			if [expr $dy > $galaxysize/2] {
			    set dy [expr abs($dy - $galaxysize)];
			}
			set d [expr sqrt($dx*$dx+$dy*$dy)];
			if [expr ($d <= $maxd) && ($d >= $mind)] {
			    set row "$row $d";
			} else {
			    set got_planet 0;
			}
		    }    
		    {-v -visitor} {
			if [expr [llength $opt1]>1] {
			    set t1 [lindex [splitline $row] 6];
			    if [expr [string first [lindex $opt1 1] $t1] == -1] {
				set t1 [lindex [splitline $row] 5];
				if [expr [string first [lindex $opt1 1] $t1] == -1] {
				    set got_planet 0;
				}	
			    }    
			} elseif [expr [string length [lindex [splitline $row] 6]]<2] {
			    if [expr [string length [lindex [splitline $row] 5]]<2] {
				set got_planet 0;
			    }
			}
		    }    
		    {-o -owner} {
			if [expr [llength $opt1]>1] {
			    set t1 [lindex [splitline $row] 5];
			    if [expr [string first [lindex $opt1 1] $t1] == -1] {
				set got_planet 0;
			    }    
			} elseif [expr [string length [lindex [splitline $row] 5]]<2] {
			    set got_planet 0;
			}
		    }    
		    {-s -smaller} {
			set d [lindex [splitline $row] 3];
			if [string compare $d "?"] {
			    if [expr $d > [lindex $opt1 1]] {
				set got_planet 0;
			    }	
			} else {
			    set got_planet 0;
			}
		    }    
		    {-b -bigger} {
			set d [lindex [splitline $row] 3];
			if [string compare $d "?"] {
			    if [expr $d < [lindex $opt1 1]] {
				set got_planet 0;
			    }	
			} else {
			    set got_planet 0;
			}
		    }    
		}	
	    }
	    if $got_planet {	    
		if [info exists formatstr] {
		    set row [lindex [splitline $row] 0];
		    set row [format $formatstr $row];
		}
		puts $row;
	        set a [expr $a + 1];
	    }
	}
	puts "\012Found $a planets"
    }

    players {
	foreach row $playerdata {
	    puts $row;
            set a [expr $a + 1];
	}
	puts "\012Found $a players"
    }

    report {
	puts [exec $reportanalyzer $dir/reports/latest];
    }

    groups {
	set groupdata [split [exec cat $dir/reports/latest] \012];
	set t1 looking;
	foreach row $groupdata {
	    if [string compare $t1 "grouplist"] { 
		if [regexp ^.*G.*#.*T.*D.*W.*S.*C.*T.*Q.*M.*S.*I.*D.*.L $row] {
		    if [expr ![info exists formatstr]] {
			puts "\012       Your Groups\012\012$row";
		    }
		    set t1 grouplist;
		}
	    } elseif [string compare $t1 "looking"] { 
		if [string length $row] {
		    set t2 [splitline $row];
		    foreach opt1 $opts {
			case [lindex $opt1 0] {
			    none {set got_ship 1}
			    {-d -dist} {
				set t3 [lindex $row 13];
				if [expr ![string compare $t3 "?"]] {
				    set t3 [lindex $row 14];
				}    
				set t3 [splitline [lindex $planetdata $t3]];
				set dx [expr abs([lindex $t3 1] - $orgx)];
				set dy [expr abs([lindex $t3 2] - $orgy)];
				if [expr $dx > $galaxysize/2] {
				    set dx [expr abs($dx - $galaxysize)];
				}
				if [expr $dy > $galaxysize/2] {
				    set dy [expr abs($dy - $galaxysize)];
				}
				set d [expr sqrt($dx*$dx+$dy*$dy)];
				if [expr ($d <= $maxd) && ($d >= $mind)] {
				    set row "$row $d";
				} else {
				    set got_ship 0;
				}
			    }    
			    {-n -name} {
				if [expr [string first [lindex $opt1 1] [lindex $t2 2]] == -1] {
				    set got_ship 0;
				}
			    }
			    {-c -col} {
				if [expr ![lindex $t2 6]] {
				    set got_ship 0;
				}
			    }
			    {-s -shield} {
				if [expr ![lindex $t2 5]] {
				    set got_ship 0;
				}
			    }
			    {-w -weapon} {
				if [expr ![lindex $t2 4]] {
				    set got_ship 0;
				}
			    }
			    {-noc -nocol} {
				if [expr [lindex $t2 6]] {
				    set got_ship 0;
				}
			    }
			    {-nos -notshield} {
				if [expr [lindex $t2 5]] {
				    set got_ship 0;
				}
			    }
			    {-now -noweapon} {
				if [expr [lindex $t2 4]] {
				    set got_ship 0;
				}
			    }
			    {-m -mass} {
				if [expr [lindex $opt1 1] > [lindex $t2 9]] {
				    set got_ship 0;
				}
			    }
			}
		    }	
		    if $got_ship {
			if [info exists formatstr] {
			    set row [lindex [splitline $row] 0];
			    set row [format $formatstr $row];
			}
			puts $row;
		    }
		} else {
		    set t1 looking;
		}
	    }
	}
    }

    battles {
	foreach row $battledata {
	    puts $row;
	    set a [expr $a + 1];
	}
	puts "\012Found $a battles"
    }

    ships {
	set name none;
	foreach row $shipdata {
	    set t1 [splitline $row];
	    foreach opt1 $opts {
		case [lindex $opt1 0] {
		    none {
			set got_ship 1;
		    }
		    {-w -weapon} {
			set got_ship [expr $got_ship && [expr [lindex $t1 4]>=[lindex $opt1 1]]];
		    }
		    {-m -mass} {
			set got_ship [expr $got_ship && [expr [lindex $t1 7]>=[lindex $opt1 1]]];
		    }
		    {-sp -speed} {
			set got_ship [expr $got_ship && [expr [lindex $t1 8]>=[lindex $opt1 1]]];
		    }
		    {-sh -shield} {
			set got_ship [expr $got_ship && [expr [lindex $t1 9]>=[lindex $opt1 1]]];
		    }
		    {-n -name} {
			set got_ship [expr $got_ship && [expr [string first [lindex $opt1 1] [lindex $t1 0]]!=-1]];
		    }
		}
	    }
	    if $got_ship {
		if [string compare $name [lindex $t1 0]] {
		    set name [lindex $t1 0];
		    puts "\012\012     $name Ship Types";
		    puts "";
		}
		puts [buildline [lreplace $t1 0 0]];
		set a [expr $a + 1];
	    }
	}
	puts "\012Found $a ship types"
    }

    default {
	puts "Unknown option, use ggrep <help>";
    }
}

