#include <lib.h>
#include <daemons.h>

inherit LIB_DAEMON;

static void eventUpdate() {

    if(!file_exists("/secure/tmp/update.lock")){
	string config_file = read_file("/secure/include/config.h");
        string native = read_file( (file_exists("/secure/sefun/native_version.c") ?
"/secure/sefun/native_version.c" : "/secure/scripts/native_version.proto"));
        string ver = mudlib_version();
        string mudinfo = replace_string(read_file("/secure/sefun/mud_info.c"),
                ver,"2.4.1");
        string native_rev = replace_string((native ? native :
"string native_version() { return \"UNKNOWN\";}"),
                "UNKNOWN",ver);
        if(query_os_type() == "unix") mudinfo = replace_string(mudinfo,"2.4.1","2.4.0");
        write_file("/secure/sefun/mud_info.c",mudinfo,1);
        write_file("/secure/sefun/native_version.c",native_rev,1);
        tc("ver: "+ver);
        tc("native: "+native);

	load_object("/secure/cmds/admins/removeraces")->cmd();
	write_file("/secure/tmp/update.lock","The mud will probably reboot twice.");

	if(sizeof(config_file)){

	    if(!grepp(config_file, "PLAYER_KILL")) 
		config_file = append_line(config_file,"GLOBAL_MONITOR",
		  "#define PLAYER_KILL              1");

	    if(!grepp(config_file, "HOST_IP"))
		config_file = append_line(config_file,"DEFAULT_PROMPT",
		  "#define HOST_IP                  \"127.0.0.1\"");

	    if(!grepp(config_file, "LOCAL_TIME"))
		config_file = append_line(config_file,"GMT_OFFSET",
		  "#define LOCAL_TIME               1");

	    if(!grepp(config_file, "EXTRA_TIME_OFFSET"))
		config_file = append_line(config_file,"LOCAL_TIME",
		  "#define EXTRA_TIME_OFFSET        0");

	    if(!grepp(config_file, "NPC_CATCH_TELL_DEBUG"))
		config_file = append_line(config_file,"PLAYER_KILL",
		  "#define NPC_CATCH_TELL_DEBUG     0");

	    if(!grepp(config_file, "SAME_IP_MAX"))
		config_file = append_line(config_file,"NPC_CATCH_TELL_DEBUG",
		  "#define SAME_IP_MAX              4");

	    if(!grepp(config_file, "COMPAT_MODE"))
		config_file = append_line(config_file,"SAME_IP_MAX",
		  "#define COMPAT_MODE              1");

	    if(!grepp(config_file, "RETAIN_ON_QUIT"))
		config_file = append_line(config_file,"COMPAT_MODE",
		  "#define RETAIN_ON_QUIT           1");

	    if(!grepp(config_file, "MAX_COMMANDS_PER_SECOND"))
		config_file = append_line(config_file,"RETAIN_ON_QUIT",
		  "#define MAX_COMMANDS_PER_SECOND  10");

	    if(!grepp(config_file, "DEFAULT_PARSING"))
		config_file = append_line(config_file,"MAX_COMMANDS_PER_SECOND",
		  "#define DEFAULT_PARSING          0");


	    if(!grepp(config_file, "CALL_OUT_LOGGING")){
		string thing = "// Note: call_out logging breaks a lot of code.\n";
		thing += "// only use it in extremis. Reboot when activating\n";
		thing += "// or deactivating it.\n";
		thing += "#define CALL_OUT_LOGGING         0";
		config_file = append_line(config_file,"DEFAULT_PARSING",thing);
	    }

	    if(!grepp(config_file, "EVENTS_LOGGING"))
		config_file = append_line(config_file,"CALL_OUT_LOGGING",
		  "#define EVENTS_LOGGING           1");

	    if(!grepp(config_file, "DISABLE_REBOOTS"))
		config_file = append_line(config_file,"EVENTS_LOGGING",
		  "#define DISABLE_REBOOTS          0");

	    if(!grepp(config_file, "BARE_EXITS"))
		config_file = append_line(config_file,"DISABLE_REBOOTS",
		  "#define BARE_EXITS               0");;

	    if(!grepp(config_file, "COMMAND_MATCHING"))
		config_file = append_line(config_file,"BARE_EXITS",
		  "#define COMMAND_MATCHING         0");;

	    if(!grepp(config_file, "OBJECT_MATCHING"))
		config_file = append_line(config_file,"COMMAND_MATCHING",
		  "#define OBJECT_MATCHING          0");

	    if(!grepp(config_file, "LIVEUPGRADE_SERVER"))
		config_file = append_line(config_file,"OBJECT_MATCHING",
		  "#define LIVEUPGRADE_SERVER       \"Dead Souls\"");

            if(!grepp(config_file, "CARRIAGE_RETURN"))
                config_file = append_line(config_file,"LIVEUPGRADE_SERVER",
                  "#define CARRIAGE_RETURN          \"\r\"");

            if(!grepp(config_file, "OLD_STYLE_PLURALS"))
                config_file = append_line(config_file,"CARRIAGE_RETURN",
                  "#define OLD_STYLE_PLURALS        0");

            if(!grepp(config_file, "NM_STYLE_EXITS"))
                config_file = append_line(config_file,"OLD_STYLE_PLURALS",
                  "#define NM_STYLE_EXITS           1");

	    write_file("/secure/include/config.h", config_file+"\n", 1);
	}

	load_object("/secure/cmds/admins/addraces")->cmd();

	debug_message("\nUpgrade is half done. Performing the first of two reboots.\n");
	debug_message("\nYou can safely ignore errors seen here.\n");
	call_out( (: shutdown :), 2);
    }

    else {
        string newfile = "#include <lib.h>\n";
	newfile += "\n";
	newfile += "inherit LIB_DAEMON;\n";
	newfile += "\n";
	newfile += "static void eventUpdate() {}\n";
	newfile += "\n";
	newfile += "static void create() {\n";
	newfile += "    daemon::create();\n";
	newfile += "    call_out((: eventUpdate :), 60);\n";
	newfile += "}\n";


	rm("/secure/tmp/update.lock");
	rm("/doc/sefun/tell_room");
	rm("/www/ds-lpu-faq.html");
	rm("/spells/resurrection.c");
	rm("/cmds/creators/move.c");
	rmdir("/domains/town/secure");
	rm("/secure/cmds/creators/force.c");
	rm("/secure/cmds/creators/locate.c");
	rm("/secure/cmds/creators/banish.c");
	rm("/secure/daemon/players.h");
	rm("/secure/daemon/player.c");
	rm("/secure/cmds/router.c");
	rm("/secure/cmds/creators/roommaker.c");
	rm("/secure/sefun/groups.c");
	rm("/save/intermud.o");
	rm("/lib/guild.c");
	rm("/www/doc/ds-faq.html");
	rm("/www/doc/ds-admin-faq.html");
	rm("/www/doc/editor");
	rm("/www/doc/example");
	rm("/lib/include/guild.h");
	rm("/doc/help/players/thief");
	rm("/doc/help/players/mage");
	rm("/doc/help/players/cleric");
	rm("/cmds/admins/gate.c");
	rm("/cmds/admins/stargate.c");
	rm("/www/doc/ds-admin-faq.html");
	rm("/www/doc/ds-faq.html");
	rm("/www/doc/editor.html");
	rm("/www/doc/example.html");
	update("/daemon/intermud");
	mkdir("/secure/log/adm");
	rm("/cmds/creators/move.c");
	rm("/secure/obj/roommaker.c");
	mkdir("/secure/log/bak");
	rm("/cmds/creators/move.c");
	rm("/domains/campus/meals/red_wine.c");
	rm("/domains/campus/meals/wing.c");
	rm("/secure/cmds/creators/force.c");
	rm("/secure/tmp/update.lock");
	rm("/daemon/preload_check.c");
	rm("/cmds/creators/home.c");
	rm("/doc/sefun/GetCustomCommand");
	rm("/doc/sefun/GetCustomPath");
	rm("/domains/campus/obj/list.c");
	rm("/domains/campus/txt/list.txt");
	rm("/lib/props/getlivings.c");
	rm("/lib/props/poisoning.c");
	rm("/secure/daemon/update.patch");
	rm("/secure/daemon/update.new");
        rm("/cmds/creators/people.c");
        rm("/secure/daemon/i3router/socket_stuff.h");
        rm("/save/events.c");
        rm("/verbs/common/codesay.c");
        rm("/verbs/common/include/codesay.h");
        mkdir("/domains/campus/save");
      
        reload(MASTER_D);
        reload(CMD_D);

        PLAYERS_D->CompileCreList();
        PLAYERS_D->CompilePlayerList();

        rename("/secure/daemon/update.c", "/secure/daemon/update.patch");
	write_file("/secure/daemon/update.c",newfile,1);

	debug_message("\nUpgrade is done. Performing the last of two reboots.\n");
	//debug_message("\nYou can safely ignore errors seen here.\n");
	call_out( (: shutdown :), 2);
    }
}

static void create() {
    daemon::create();
    call_out((: eventUpdate :), 2);
}

