#!/usr/bin/tclsh

proc getLevelName {fileName} {
    set fp [open $fileName "r"]
    while {-1 != [gets $fp line]} {
	if {-1 != [string first "BMLevelData" $line]} {
	    close $fp
	    return [lindex $line 2]
	}
    }
    close $fp
    return {}
}

proc isLevelIncluded {levelFile} {
    set fp [open data.c "r"]
    while {-1 != [gets $fp line]} {
	if {-1 != [string first "#include" $line]} {
	    if {-1 != [string first "$levelFile" $line]} {
		close $fp
		return 1
	    }
	}
    }
    close $fp
    return 0
}

proc isLevelUsed {levelName} {
    set fp [open data.c "r"]
    while {-1 != [gets $fp line]} {
	if {-1 != [string first "&$levelName," $line]} {
	    close $fp
	    return 1
	}
    }
    close $fp
    return 0
}



proc insertLevel {levelName levelFile} {
    set fp [open data.c "r"]
    set out [open "\#data.c" "w"]
    set mode 1
    while {-1 != [gets $fp line]} {
	if {-1 != [string first "No new levels beyond this point" $line]} {
	    if {$mode} {
		puts $out "\#include \"$levelFile\""
		set mode 0
	    } else {
		puts $out "  &$levelName,"
	    }
	}
	puts $out $line
    }
    close $fp
    close $out
}


proc deleteLevel {levelName levelFile} {
    set fp [open data.c "r"]
    set out [open "\#data.c" "w"]
    while {-1 != [gets $fp line]} {
	if { (-1 == [string first "\#include" $line]) \
		|| (-1 == [string first $levelFile $line])} {
	    if {-1 == [string first "&$levelName," $line]} {
		puts $out $line
	    }
	}
    }
    close $fp
    close $out
}


proc changeLevelMax {by} {
    set fp [open "include.h" "r" ]
    set out [open "\#include.h" "w"] 
    while {-1 != [gets $fp line]} {
	if {-1 != [string first "\#define LEVEL_MAX" $line]} {
	    set value [lindex $line 2]
	    incr value $by
	    puts $out "\#define LEVEL_MAX $value"
	} else {
	    puts $out $line
	}
    }
    close $fp
    close $out
}


proc renameFile {fileName} {
    set newFileName "\#$fileName"
    set bakFileName "$fileName\~"
 
    if {![file exists $newFileName]} {
	puts "File \"$newFileName\" does not exist"
	return
    }
    if {[file exists $fileName]} {
	exec mv $fileName $bakFileName
	exec mv $newFileName $fileName
    }
    puts "Old file stored in $bakFileName"
}



proc addLevel {argc argv0 argv} {
    #
    # check args
    #
    if {1 != $argc} {
	puts "Usage $argv0 levelFile"
	exit 
    }
    set levelFile [lindex $argv 0]
    
    
    #
    # get name of level
    #
    if {{}==[set levelName [getLevelName $levelFile]]} {
	puts "Level name not found in file \"$levelFile\""
	return
    }
    if {[isLevelIncluded $levelFile]} {
	puts "Level file is already included in \"data.c\""
	return
    }
    if {[isLevelUsed $levelName]} {
	puts "Level named \"$levelName\" already exists in \"data.c\""
	return
    }
    
    insertLevel $levelName $levelFile

    changeLevelMax 1

    renameFile data.c
    renameFile include.h

    puts "Ready!"
    return
}



proc removeLevel {argc argv0 argv} {
    #
    # check args
    #
    if {1 != $argc} {
	puts "Usage $argv0 levelFile"
	exit 
    }
    set levelFile [lindex $argv 0]
    
    
    #
    # get name of level
    #
    if {{}==[set levelName [getLevelName $levelFile]]} {
	puts "Level name not found in file \"$levelFile\""
	return
    }
    if {! [isLevelIncluded $levelFile]} {
	puts "Level file is not included in \"data.c\""
	return
    }
    if {! [isLevelUsed $levelName]} {
	puts "Level named \"$levelName\" does not exists in \"data.c\""
	return
    }
    
    deleteLevel $levelName $levelFile

    changeLevelMax -1

    renameFile data.c
    renameFile include.h

    puts "Ready!"
    return
}

#
# main program
#
[file tail $argv0] $argc $argv0 $argv
exit




