#pragma strict_types
#pragma no_clone
#pragma no_shadow
#pragma no_inherit
#pragma verbose_errors
#pragma combine_strings
#pragma rtt_checks
#pragma pedantic
#pragma warn_deprecated

#include "/secure/config.h"
#include "/secure/wizlevels.h"

#define MAX_ROOMS_PER_LIST 10

// die div. Speicherorte und Pfade
#define SAVEFILE    "/secure/ARCH/potions"
#define TIPS(x)     "/secure/ARCH/ZT/"+x
#define ORAKEL      "/room/orakel"
#define POTIONTOOL  "/obj/tools/ptool"

// Fuer die Dump-Funktion
#define POTIONDUMP "/secure/ARCH/POTIONS.dump"
#define DUMP(str)   write_file(POTIONDUMP, str)

// Modifikationen loggen. "event" ist eins der Events aus der Liste:
// ADD_POTION, ACTIVATE, DEACTIVATE, MODIFY_PATH, MODIFY_LISTNO
#define LOGFILE_MOD     "/log/ARCH/POTIONS_MOD.log"
#define MODLOG(event,num,data) write_file(LOGFILE_MOD, \
  sprintf("%17s %-14s %-3d sEUID %s %s\n", \
    strftime("%Y-%b-%d %R"), event, num, secure_euid(), data) )

// Indizierungs-Konstanten fuer das potions-Mapping
#define POT_ROOMNAME 0
#define POT_LISTNO   1

// Konstanten fuer div. Rueckgabewerte. Keine 0, da das eine gueltige ZT-ID
// sein kann und abfragende Objekte verwirren koennte.
#define POT_IS_ACTIVE            1
#define POT_ACCESS_DENIED       -1
#define POT_WRONG_DATATYPE      -2
#define POT_NO_SUCH_ROOM        -3
#define POT_ALREADY_REGISTERED  -4
#define POT_INVALID_POTION      -5
#define POT_NO_SUCH_FILE        -6
#define POT_INVALID_LIST_NUMBER -7
#define POT_ALREADY_ACTIVE      -8
#define POT_ALREADY_INACTIVE    -9
#define POT_NOT_INACTIVE       -10
#define POT_NOT_ACTIVE         -11

// Zaehler fuer den als naechsten anzulegenden ZT
private int nextroom;

// Liste aller ZTs einschl. inaktive, ([ int num : string room; int list ])
private mapping potions = ([]);

// Liste der inaktiven ZTs, ({ int num })
private int *inactive = ({});

// Cache mit den einzelnen Listen, ([ int list : int *potionlist ])
private nosave mapping lists;

// reverse_table Lookup Cache, ([string room: int number])
private nosave mapping reverse_table = ([]);

// Cache fuer die bereits von der Platte eingelesenen ZTs, um Plattenzugriffe
// insbesondere beim Erzeugen der Tipliste durch das Orakel zu reduzieren.
private nosave mapping tipmap = ([]);

int ActivateRoom(string room);

private int secure() {
  return (!process_call() && ARCH_SECURITY);
}

mixed QueryPotionData(int num) {
  if ( !secure() )
    return POT_ACCESS_DENIED;
  return ([num : potions[num,0]; potions[num,1] ]);
}

int *QueryInactivePotions() {
  return copy(inactive);
}

private void RebuildCache() {
  // Cache invalidieren; vor-initialisiert zur Beschleunigung des Rebuilds.
  lists = ([0:({}),1:({}),2:({}),3:({}),4:({}),5:({}),6:({}),7:({})]);
  reverse_table = ([]);
  foreach (int num, string room, int list : potions) {
    m_add(reverse_table, room, num);
    lists[list] += ({num});
  }
  return;
}

int QueryActive(mixed potion) {
  if ( extern_call() && !secure() )
    return POT_ACCESS_DENIED;
  int ret;
  // Wenn nach dem Pfad des ZTs gefragt wird, diesen zuerst in die Nummer
  // umwandeln durch Lookup im reverse_table Cache
  if ( stringp(potion) ) {
    potion = reverse_table[potion];
  }
  // Ein ZT ist aktiv, wenn er in der Liste potions steht und nicht in der
  // Liste der inaktiven ZTs (inactive) steht. Dann dessen Nummer
  // zurueckgeben; inaktive zuerst pruefen, weil die inaktiven auch in 
  // "potions" enthalten sind und somit alle ZTs ausser den ungueltigen
  // als aktiv gemeldet wuerden.
  if ( member(inactive,potion)>-1 )
    ret = POT_NOT_ACTIVE;
  else if ( member(potions,potion) && potions[potion,POT_LISTNO]!=-1 )
    ret = potion;
  // ansonsten ist das kein gueltiger ZT
  else
    ret = POT_INVALID_POTION;
  return ret;
}

private void save_info() {
  save_object(SAVEFILE);
}

protected void create() {
  seteuid(getuid(this_object()));
  if ( !restore_object(SAVEFILE) ) {
    // Fehler ausgeben, damit es jemand merkt. Dennoch wird jetzt im Anschluss
    // der Cache neu aufgebaut (damit die Datenstrukturen gueltig sind).
    catch(raise_error("Potionmaster: no/corrupt savefile! Reinitializing.\n"); publish);
  }
  RebuildCache();
}

int AddPotionRoom(string room, int list) {
  if ( !secure() )
    return POT_ACCESS_DENIED;
  // Neuer Raum muss ein gueltiger String sein.
  if ( !stringp(room) )
    return POT_WRONG_DATATYPE;
  if ( !intp(list) || list<0 || list>7 )
    return POT_WRONG_DATATYPE;

  // Pfad normalisieren - Expansion von Platzhaltern ist hier ziemlich
  // sinnloss und faellt daher weg (Neue ZTs in /players/ gibts eh nicht
  // mehr.)
  room=(string)master()->make_path_absolute(room);

  // Datei mit dem ZT-Spruch muss existieren.
  if ( file_size( TIPS(to_string(nextroom)+".zt") ) < 0 ) {
    raise_error("Potionmaster: Tipfile missing, please create "+
      to_string(nextroom)+".zt");
    return POT_NO_SUCH_FILE;
  }
  // Neuer Raum darf noch nicht in der Liste enthalten sein.
  if ( member(m_values(potions,POT_ROOMNAME), room)!=-1)
    return POT_ALREADY_REGISTERED;
  // Neuer Raum muss ladbar sein.
  if ( catch(load_object(room); publish) )
    return POT_NO_SUCH_ROOM;

  // Jetzt kann's endlich losgehen, Raum eintragen, nextroom hochzaehlen
  m_add(potions, nextroom, room, list);
  MODLOG("ADD_POTION", nextroom, room);
  // Neu eingetragene ZTs werden auch gleich aktiviert; ActivateRoom()
  // baut den Cache selbst neu auf, daher kann das hier entfallen.
  ActivateRoom(room);
  nextroom++;
  save_info();
  return nextroom;
}

int ChangeRoomPath(string old, string new) {
  if ( !secure() )
    return POT_ACCESS_DENIED;

  // beide Pfade muessen gueltige Strings sein
  if ( !stringp(old) || !stringp(new) )
    return POT_WRONG_DATATYPE;

  // Pfad normalisieren - Expansion von Platzhaltern ist hier ziemlich
  // sinnloss und faellt daher weg (Neue ZTs in /players/ gibts eh nicht
  // mehr.)
  old=(string)master()->make_path_absolute(old);
  new=(string)master()->make_path_absolute(new);

  // Der neue Raum darf nicht bereits eingetragen sein, ...
  if ( member(reverse_table,new) )
    return POT_ALREADY_REGISTERED;
  // ... und der alte Raum muss noch eingetragen sein.
  if ( !member(reverse_table,old) )
    return POT_NO_SUCH_ROOM;
  // Neuer Raum muss ladbar sein.
  if (catch(load_object(new);publish))
    return POT_NO_SUCH_ROOM;

  // Aktuelle ZT-Nummer des alten Pfades ermitteln
  int num = reverse_table[old];
  // Pfad aendern, Cache neubauen und Savefile speichern
  potions[num,POT_ROOMNAME] = new;
  RebuildCache();
  save_info();
  MODLOG("MODIFY_PATH", num, old+" => "+new);
  return num;
}

int ActivateRoom(string room) {
  if ( !secure() )
    return POT_ACCESS_DENIED;
  // Aktuelle ZT-Nummer ermitteln. Etwas umstaendlich, da im Fehlerfall -1
  // benoetigt wird.
  int num = member(reverse_table,room) ? reverse_table[room] : -1;
  // Nummer muss existieren
  if ( num == -1 )
    return POT_INVALID_POTION;
  // ZT ist nicht inaktiv, dann kann man ihn auch nicht aktivieren.
  if ( member(inactive, num)==-1 )
    return POT_ALREADY_ACTIVE;
  inactive -= ({num});
  RebuildCache();
  save_info();
  MODLOG("ACTIVATE", num, room);
  return num;
}

int SetListNr(string room, int list) {
  if ( !secure() )
    return POT_ACCESS_DENIED;
  // Aktuelle ZT-Nummer ermitteln. Etwa umstaendlich, da im Fehlerfall -1
  // benoetigt wird.
  int num = member(reverse_table,room) ? reverse_table[room] : -1;
  // Nummer muss existieren
  if ( num == -1 )
    return POT_INVALID_POTION;
  // Listennummer muss zwischen 0 und 7 liegen.
  if ( list < 0 || list > 7 )
    return POT_INVALID_LIST_NUMBER;

  // alte Nummer aufschreiben zum Loggen.
  int oldlist = potions[num,POT_LISTNO];
  // Listennummer in der ZT-Liste aktualisieren.
  potions[num,POT_LISTNO] = list;
  RebuildCache();
  save_info();
  MODLOG("MODIFY_LISTNO", num, oldlist+" -> "+list);
  return num;
}

int DeactivateRoom(string room) {
  if ( !secure() )
    return POT_ACCESS_DENIED;
  // Aktuelle ZT-Nummer ermitteln. Etwa umstaendlich, da im Fehlerfall -1
  // benoetigt wird.
  int num = member(reverse_table,room) ? reverse_table[room] : -1;
  // Nummer muss existieren
  if ( num == -1 )
    return POT_INVALID_POTION;
  // ZT darf nicht bereits inaktiv sein
  if ( member(inactive,num)>-1 )
    return POT_ALREADY_INACTIVE;
  inactive += ({num});
  RebuildCache();
  save_info();
  MODLOG("DEACTIVATE", num, room);
  return num;
}

private int *_create_list(int listno, int anz) {
  int *list = ({});
  // Listenerzeugung lohnt nur dann, wenn mind. 1 Eintrag gefordert wird und
  // die Listennummer im gueltigen Bereich zwischen 0 und 7 ist.
  if ( anz>0 && listno>=0 && listno<=7 ) {
    int *tmp = lists[listno] - inactive;
    // Wenn die Listengroesse maximal genauso gross ist wie die angeforderte
    // Anzahl, kann diese vollstaendig uebernommen werden.
    if ( sizeof(tmp) <= anz ) {
      list = tmp;
    } else { // ansonsten soviele Eintraege erzeugen wie angefordert
      foreach(int i: anz) {
        int j=random(sizeof(tmp));
        list += ({tmp[j]});
        tmp -= ({tmp[j]});
      }
    }
  }
  return list;
}

mixed *InitialList() {
  mixed *list=({});
  foreach(int i : 8)
    list+=_create_list(i,MAX_ROOMS_PER_LIST);
  return list;
}

// Aufrufe aus den Spielershells und dem Potiontool sind erlaubt
int HasPotion(object room) {
  if ( !query_once_interactive(previous_object()) && 
       load_name(previous_object()) != POTIONTOOL )
    return POT_ACCESS_DENIED;
  return objectp(room) ? reverse_table[object_name(room)] : POT_NO_SUCH_ROOM;
}

// Listennummer ermitteln, in der der ZT num enthalten ist.
// Auch inaktive ZTs werden als zu einer Liste gehoerig gemeldet.
int GetListByNumber(int num) {
  return member(potions,num) ? potions[num,POT_LISTNO] : POT_INVALID_POTION;
}

// Listennummer ermitteln, in der der inaktive ZT num enthalten ist.
// Da alle Zaubertraenke in einer Gesamtliste enthalten sind, kann direkt das
// Resultat von GetListByNumber() zurueckgegeben werden.
int GetInactListByNumber(int num) {
  if ( member(inactive,num) > -1 )
    return GetListByNumber(num);
  else
    return POT_NOT_INACTIVE;
}

// Wird nur von /obj/tools/ptool aufgerufen. Wenn der Aufruf zugelassen wird,
// erfolgt von dort aus ein ChangeRoomPath(), und dort wird bereits geloggt.
// Erzmagier duerfen auch aufrufen.
mixed GetFilenameByNumber(int num) {
  if ( extern_call() && 
       object_name(previous_object()) != POTIONTOOL &&
       !ARCH_SECURITY )
    return POT_ACCESS_DENIED;
  if ( !member(potions, num) )
    return POT_INVALID_POTION;
  return potions[num,POT_ROOMNAME];
}

// Wird vom Spielerobjekt gerufen; uebergeben werden der Raum, der initial
// FindPotion() aufrief, die ZT-Liste des Spielers sowie die Liste bereits
// gefundener ZTs.
//
// In std/player/potion.c ist sichergestellt, dass room ein Objekt ist und
// dass die Listen als Int-Arrays uebergeben werden.
//
// Es werden aus historischen Gruenden (noch) beide ZT-Listen uebergeben,
// aber es muss nur knownlist ueberprueft werden, da diese eine Teilmenge
// von potionlist ist und somit jeder ZT in ersterer auf jeden Fall auch
// in letzterer enthalten sein _muss_.
int InList(object room, int *potionlist, int *knownlist) {
  if ( !query_once_interactive(previous_object()) && !secure() )
    return 0; //POT_ACCESS_DENIED;
  int num = QueryActive(object_name(room));
  
  // Zunaechst keinen Fehlercode zurueckgeben, weil das Spielerobjekt
  // damit im Moment noch nicht umgehen kann.
  if ( num < 0 )
    return 0; //POT_INVALID_POTION;

  return (member(knownlist,num)>-1);
}

// Wird vom Spielerobjekt gerufen, um einen gefundenen ZT aus dessen ZT-
// Listen austragen zu lassen. Das Spielerobjekt stellt sicher, dass room
// ein Objekt ist, und dass [known_]potionrooms Arrays sind.
//
// ACHTUNG! Sowohl potionrooms, als auch known_potionrooms sind die
//          Originaldaten aus dem Spielerobjekt, die hier ALS REFERENZ
//          uebergeben werden! Vorsicht bei Aenderungen an der Funktion!
//
// Wenn std/player/potions.c geaendert wird, ist diese Funktion obsolet
// => ggf. komplett rauswerfen. Dann kann auch der Fehlercode in InList()
// reaktiviert und deren Parameter korrigiert werden
void RemoveList(object room, int* potionrooms, int* known_potionrooms) {
  // ZT ist aktiv, das wurde bereits in InList() geprueft, das vor dem
  // Aufruf von RemoveList() aus dem Spielerobjekt gerufen wird. Daher reicht
  // es aus, die ZT-Nummer aus dem reverse_table Lookup zu holen.
  int num = reverse_table[object_name(room)];
  int tmp = member(potionrooms, num);
  potionrooms[tmp] = -1;
  tmp = member(known_potionrooms, num);
  known_potionrooms[tmp] = -1;
  return;
}

#define LISTHEADER "################## Liste %d ################## (%d)\n\n"
#define INACT_HEADER "################## Inaktiv ################## (%d)\n\n"

int DumpList() {
  if ( !secure() )
    return POT_ACCESS_DENIED;
  // Zuerst die Caches neu aufbauen, um sicherzustellen, dass die Listen
  // aktuell sind.
  RebuildCache();
  // Dumpfile loeschen
  rm(POTIONDUMP);
  // Alle Listen der Reihe nach ablaufen. Es wird in jedem Schleifendurchlauf
  // einmal auf die Platte geschrieben. Das ist Absicht, weil es speicher-
  // technisch sehr aufwendig waere, die Ausgabedaten stattdessen erst in
  // einer Variablen zu sammeln und dann wegzuschreiben.
  foreach(int *listno : sort_array(m_indices(lists),#'>)) {
    // Zuerst den Header der ensprechenden Liste schreiben.
    DUMP(sprintf(LISTHEADER, listno, sizeof(lists[listno])));
    // Dann alle Potions der Liste durchgehen
    foreach(int potion : lists[listno]) {
      // Wenn der ZT inaktiv ist, ueberspringen wir den.
      if ( member(inactive,potion)>-1 )
        continue;
      // Raumpfad aus der Gesamtliste holen.
      string str = potions[potion,POT_ROOMNAME];
      // Wenn der nicht existiert, entsprechenden Hinweis dumpen, ansonsten
      // den Raumnamen.
      //ZZ: ich finde ja, wir sollten sicherstellen, dass das nicht mehr
      //passiert. Ist das mit dem AddPotionRoom oben nicht schon so?
      if ( !stringp(str) || !sizeof(str) )
        str="KEIN RAUM ZUGEORDNET!!!";
      DUMP(sprintf("%3d. %s\n", potion, str));
    }
    // 2 Leerzeilen zwischen jeder Gruppe einfuegen
    DUMP("\n\n");
  }
  // Zum Schluss den Header der Inaktiv-Liste schreiben.
  DUMP(sprintf(INACT_HEADER, sizeof(inactive)));
  // Dann alle inaktiven Potions ablaufen
  foreach(int i : inactive) {
    //ZZ: sonst muesste man hier wohl auch auf den fehlenden Raum pruefen.
    DUMP(sprintf("%3d. (Liste %d) %s\n", i, GetListByNumber(i),
      potions[i,POT_ROOMNAME]));
  }
  return 1;
}

//ORAKEL-Routinen

/* Aufbau eines Tips:

   Tralala, lalala
   Dideldadeldum
   Huppsdiwupps
   XXXXX
   Noch ein zweiter Tip
   Dingeldong
   %%%%%

   Die Prozentzeichen sind das Endezeichen, ab hier koennen eventuelle
   Kommentare stehen. Die 5 X sind das Trennzeichen zwischen zwei Tips
   zum selben ZT.
*/

// TIPLOG() derzeit unbenutzt
//#define LOGFILE_READ    "ARCH/POTIONS_TIP_READ.log"
//#define TIPLOG(x)      log_file(LOGFILE_READ, x)

mixed TipLesen(int num) {
  string *ret = tipmap[num];
  //Funktion darf nur vom Orakel und EM+ gerufen werden.
  if ( previous_object() != find_object(ORAKEL) && !secure() )
    return POT_ACCESS_DENIED;
  // Derzeit kein Log, da diese Informationen tendentiell eher 
  // uninteressant sind.
  // Timestamp ist vom Format "2012-Okt-03 14:18"
  /*TIPLOG(sprintf("%s ZT-Tip gelesen: %d von TP: %O, PO: %O, TI: %O\n",
    strftime("%Y-%b-%d %R"), num, this_player(), previous_object(),
    this_interactive()));*/

  // ZT-Spruch ist bereits im Tip-Cache enthalten, dann direkt ausgeben.
  if ( pointerp(ret) )
    return ret;
  
  // ZT-Spruch auf grundlegende syntaktische Korrektheit pruefen:
  // explode() liefert ein Array mit 2 Elementen, wenn die Ende-Markierung
  // vorhanden und somit das File diesbezueglich korrekt aufgebaut ist.
  string *tip=explode( read_file(TIPS(num+".zt"))||"", "%%%%%" );
  if (sizeof(tip) >= 2) {
    // Der erste Eintrag in dem Array ist dann der Spruch. Wenn dieser
    // die Trenn-Markierung enthaelt, entstehen hier 2 Hinweise, ansonsten
    // bleibt es bei einem.
    tipmap[num] = explode(tip[0], "XXXXX\n");
    return tipmap[num];
  }
  return POT_NO_SUCH_FILE;
}

// Datenkonvertierung alte Alists => Mappings
/*mapping ConvertData() {
  //if ( !secure()) ) return;
  // all_rooms ist eine Alist der Form ({ string *room, int *number })
  // als 3. Eintrag schreiben wir ueberall -1 rein, das wird spaeter durch die
  // Listennummer des betreffenden ZTs ersetzt und erlaubt einen einfachen
  // Check auf Datenkonsistenz.
  potions = mkmapping( all_rooms[1],
                       all_rooms[0],
                       allocate(sizeof(all_rooms[0]), -1) );
  // Alle Listen ablaufen
  foreach(int *list: active_rooms ) {
    // Alle ZTs dieser Liste ablaufen und die entsprechende Listennummer in
    // der neuen Datenstruktur setzen.
    foreach(int num: list) {
      potions[num,POT_LISTNO] = member(active_rooms,list);
    }
  }
  // inactive_rooms ist eine Alist der gleichen Form. Die Schleife addiert
  // einfach alle Eintraege darin auf, so dass ein Int-Array entsteht, das
  // alle inaktiven ZT-Nummern enthaelt; das allerdings nur fuer Listen mit
  // mindestens einem Element.
  foreach(int *list : inactive_rooms ) {
    if ( sizeof(list) ) {
      inactive += list;
      // Alle ZTs dieser Liste ablaufen und die entsprechende Listennummer in
      // der neuen Datenstruktur setzen.
      foreach(int num : list) {
        potions[num,POT_LISTNO] = member(inactive_rooms,list);
      }
    }
    // unify array
    inactive = m_indices(mkmapping(inactive));
  }
  mapping invalid = ([ POT_INVALID_LIST_NUMBER : ({}) ]);
  walk_mapping(potions, function void (int pnum, string path, int listno) {
    if ( listno == -1 )
      invalid[POT_INVALID_LIST_NUMBER] += ({pnum});
  });
  return sizeof(invalid[POT_INVALID_LIST_NUMBER]) ? invalid : potions;
}*/

