#include "../haus.h"
#include <properties.h>
#include <moving.h>
#include <wizlevels.h>

inherit "std/secure_thing";

private int secure()
{
  return (this_interactive() && (IS_ARCH(this_interactive()) ||
				 getuid(this_interactive()) == "wurzel"));
}

create()
{
  if (!clonep(this_object())) return;
  ::create();

  SetProp(P_SHORT, "Ein Adressverzeichnis" );
  SetProp(P_LONG,
     "Mit diesem Adressverzeichnis koennen die richtigen Leute Ordnung in den\n"
    +"Wust der Seherhausangelegenheiten bringen.\n"
    +"Die richtigen Leute?\n"
    +"Ja: Man muss schon Erzmagier sein oder Wurzel heissen! ;)\n"
    +"Du kannst es uebrigens lesen!\n" );
  SetProp(P_NAME, "Adressverzeichnis");
  SetProp(P_READ_MSG,
     "Es stehen folgende Befehle zur Verfuegung:\n"
    +"checked <name> [+/-] <nr>\n"
    +"rep\n"
    +"mkmail <name>\n"
    );
  SetProp(P_GENDER, NEUTER);
  SetProp(P_WEIGHT, 100);
  SetProp(P_AUTOLOADOBJ, 1);
  SetProp(P_NEVERDROP, 1);
  SetProp(P_NODROP, 1);

  AddId( ({ "verzeichnis", "adressverzeichnis", "haustool" }) );

  AddCmd("checked", "checked");
  AddCmd("rep", "report");
  AddCmd("mkmail", "mkmail");
}

#define CHECKED PATH+"log/CHECKED"
static int
checked(string str)
{
  mapping drin;
  string name, *lines, *ind, pm;
  int nr, i;
  closure hp;

  if (!secure())
    return 0;

  notify_fail("Syntax: checked <name> [+/-] <nr>\n" );
  if (!str || str == "")
    return 0;

  if (file_size(CHECKED) > 0)
    lines = explode(read_file(CHECKED), "\n") - ({""});
  else
    lines = ({});

  for (drin = ([]), i=sizeof(lines)-1; i>=0; i--) {
    if (sscanf(lines[i], "%s%t%d", name, nr) == 2)
      drin += ([ name : nr-1 ]);
  }
  lines = ({ });
  pm = "";
  hp = symbol_function("HausProp", VERWALTER);

  if (sscanf(str, "%s %d", name, nr)==2 || sscanf(str, "%s %s %d", name, pm, nr) == 3) {
    if (!funcall(hp, name, HP_ENV)) {
      write(capitalize(name)+" hat gar kein Haus!\n");
      return 1;
    }
    if (nr < 0) {
      write("Zum Abziehen nimm bitte 'checked <name> - <nr>'!\n");
      return 1;
    }
    if (member(drin, name))
      i = drin[name];
    switch(pm) {
      case "+":
	if (i+nr > funcall(hp, name, HP_ROOMS)) {
	  printf("%d Raeume? Wie soll das gehen?\n", i+nr);
	  return 1;
	}
	drin[name] += nr;
	break;
      case "-":
	if (i-nr < 0) {
	  write("Soviele Raeume kannst Du "+capitalize(name)+" gar nicht abziehen...\n");
	  return 1;
	}
	drin[name] -= nr;
	break;
      default:
	if (nr > funcall(hp, name, HP_ROOMS)) {
	  printf("%s nat keine %d Raeume!\n",capitalize(name),nr);
	  return 1;
	}
	drin[name] = nr;
    }
    rm(CHECKED);
    for (i=sizeof(ind=sort_array(m_indices(drin),#'<))-1; i>=0; i--)
      write_file(CHECKED, sprintf("%s %d\n",ind[i], 1+drin[ind[i]]));
    return 1;
  }
  else
    return 0;
}

static int
report()
{
  string *rep, *head, name;
  int i, lp, nr;

  if (file_size("/log/report/wurzel.rep")<=0) {
    write("Kein wurzel.rep (Jippieh! ;)\n");
    return 1;
  }

  rep = old_explode(read_file("/log/report/wurzel.rep"),"\n");
  lp = sizeof(PATH)-1;

  for (i=sizeof(rep)-2; i>=0; i-=2) {
    head = old_explode(rep[i], " ");
    if (head[4][0..lp] == PATH) {
      name = old_explode(head[4],"/")[<1];
      nr = to_int(name[<1..<1]);
      name = name[0..<6];
      head[2] = capitalize(head[2]);
      write_file(PATH+"rep/"+name,
		 sprintf("%s in Raum %d:\n%s\n",
			 implode(head[0..2]," "),nr,rep[i+1]));
    }
    else
      write_file(PATH+"rep/wurzel.rep",sprintf("%s\n%s\n", rep[i], rep[i+1]));
  }
  return 1;
}

static int
mkmail(string str)
{
  string f,fm;

  if (!str || str == "") {
    notify_fail( "Syntax: mkmail <name>\n");
    return 0;
  }

  if (!(f=(VERWALTER)->HausProp(str, HP_ENV))) {
    printf("%s hat kein Haus!\n", str);
    return 1;
  }
  fm = PATH+str+".mail";

  write_file(fm, "\
  Huhu!\n\
\n\
Da Du Magier bist, brauchst Du auch kein Seherhaus mehr. Damit Deine\n\
Beschreibungen aber nicht verloren sind, findest Du die Files Deines\n\
Hauses in /players/"+str+"/seherhaus/.\n\
\n\
Soll Dein Haus weiterhin an der jetzigen Stelle stehen bleiben\n\
("+f+"),\n\
so klaere das bitte mit dem dort zustaendigen Magier sowie den zustaen-\n\
digen Regionsmagiern (weil es sich jetzt um den Anschluss von Files an\n\
ein Gebiet handelt).\n\
\n\
!! Das Haus wird auf jeden Fall nach Ende der Haussperre abgerissen !!\n\
\n\
  Wargon.\n");

  return 1;
}
