#pragma strong_types, save_types
#pragma no_clone, no_shadow

#include "/p/daemon/ch.h"
#include "/p/daemon/uptime_master.h"
#include <config.h>

/// Prototypen ///

void create();
void reset(); 

void SaveMaxUptime();
mapping QuerMaxUptime();

/// Globale Variablen ///
static int next_save_uptime;
static int max_uptime_reached;
static int last_record_boot;

/// Funktionen ///

void create()
{
  seteuid(getuid(this_object()));
  reset();
}

void reset()
{
  call_out("SaveMaxUptime",1);
  set_next_reset(300);
}

// Ist eine Rekord-Uptime erreicht, wird diese hier gespeichert.
void SaveMaxUptime()
{
  int max_shut, max_boot;
  
  // Lohnt es, schon wieder zu pruefen?
  if (time()>next_save_uptime)
  {
    // Initialisieren
    if (next_save_uptime==0)
    {
      DEBUG("Masterinit");
      
      // Zeit berechnen, ab der ein Rekord aufgestellt ist.
      // Vorher braucht nixhts mehr geprueft werden
      sscanf(read_file(MAX_UPTIME)||"0 0","%d %d",last_record_boot, max_shut);
      next_save_uptime=last_reboot_time()+(max_shut-last_record_boot)+1; 
      
    } else {
      DEBUG("Rekord neu speichern.");
	    
      // Neuen Rekord in Datei schreiben.
      catch(rm(MAX_UPTIME);publish);
      write_file(MAX_UPTIME, last_reboot_time()+" "+time());
      
      // Jetzt checken, ob die Uptime grade geknackt wurde ...
      // Wenn ja, dann eine Meldung an den Master
      if(last_reboot_time()!=last_record_boot)
      {
	DEBUG("Rekordmeldung. MB:"+last_record_boot+" LU:"+last_reboot_time());

	// Nur einmal pro Rekord Uptime melden ...
	last_record_boot=last_reboot_time();

	// Hurraaah :)
        CHMASTER->join(RECORD_CHANNEL,this_object());
	CHMASTER->send(RECORD_CHANNEL,this_object(),
	"[<MasteR>:Lars] Wow, eine Rekord-Uptime.\n"
	"[<MasteR>:Merlin] Das erlebt man auch nicht alle Tage ...\n"
	"[<MasteR>:Der GameDriver] Dann wird es wohl Zeit fuer einen Reboot, oder?\n"
	"[<MasteR>:Merlin] Faules Stueck, arbeite weiter!\n"
	"[<MasteR>:Der GameDriver] Och menno!",
	  MSG_EMPTY);
	CHMASTER->leave(RECORD_CHANNEL,this_object());
      }
    }
  }
}

// Gibt Daten zur bisher maximalen Uptime zurueck: (299 Ticks)
// 1.) Wann wurde gebootet
// 2.) Wann endete die Uptime
// 3.) Wann wird dieser Rekord gebrochen?
// 4.) Dauer der Uptime als lesbarer String.
mapping QueryMaxUptime()
{
  int t, tmp, max_boot, max_shut;
  string s;

  sscanf(read_file(MAX_UPTIME)||"0 0","%d %d",max_boot, max_shut);

  t=max_shut-max_boot;

  s="";
  if (t>=86400)
    s+=sprintf("%d Tag%s, ",tmp=t/86400,(tmp==1?"":"e"));
  if (t>=3600)
    s+=sprintf("%d Stunde%s, ",tmp=(t=t%86400)/3600,(tmp==1?"":"n"));
  if (t>60)
    s+=sprintf("%d Minute%s und ",tmp=(t=t%3600)/60,(tmp==1?"":"n"));
  s+=sprintf("%d Sekunde%s",t=t%60,(t==1?"":"n"));

  return (["beginn":max_boot, 
           "ende":max_shut, 
	   "naechster rekord":last_reboot_time()+(max_shut-max_boot), 
	   "rekord als string":s]);
}
