// MorgenGrauen MUDlib
//
//fileedit.c
//
// $Id: fileedit.c 9142 2015-02-04 22:17:29Z Zesstra $
#pragma strict_types
#pragma save_types
//#pragma range_check
#pragma no_clone

protected functions virtual inherit "/std/util/path";

#include <wizlevels.h>
#include <input_to.h>

#define NEED_PROTOTYPES
#include <magier.h>
#include <player.h>
#include <files.h>

//                        ###################
//######################### INITIALISIERUNG #############################
//                        ###################

mixed _query_localcmds()
{
  return ({ ({"cp","_cp",0,WIZARD_LVL}),
            ({"mv","_cp",0,WIZARD_LVL}),
            ({"rm","_rm",0,WIZARD_LVL}),
            ({"rmdir","_rmdir",0,WIZARD_LVL}),
            ({"mkdir","_mkdir",0,WIZARD_LVL}),
            ({"ed","_ed",0,WIZARD_LVL})});
}

//                               ######
//################################ ED ###################################
//                               ######


//
// _ed_file: Mehrere Files hintereinander editieren
//

private nosave string *_ed_cache;

private void _ed_file()
{
  if (!sizeof(_ed_cache)) return;
  printf("ed: Naechste Datei: %s\n",_ed_cache[0]);
  ed(_ed_cache[0],"_ed_file");
  _ed_cache=_ed_cache[1..];
  return;
}

//
// _more: Dateien anzeigen
// cmdline: Kommandozeile
//

static int _ed(string cmdline)
{
  mixed *args,*args2;
  int flags,i,arg_size;
  cmdline=_unparsed_args();
  args=parseargs(cmdline,&flags,"",1);
  if (flags==-1||!(arg_size=sizeof(args)))
    return USAGE("ed <datei> [<datei2>..]");
  while(arg_size--)
  {
    if (sizeof(args2=file_list(args[arg_size..arg_size],MODE_ED,0,"/")))
      args[arg_size..arg_size]=args2;
    else
      args[arg_size]=({ "" , -1, 0 ,
                       normalize_path(args[arg_size], getuid(), 1) });
  }
  args=map(args,(:
          if ($1[FILESIZE]>=FSIZE_NOFILE) return $1[FULLNAME];
          printf("%s ist ein Verzeichnis.\n",$1[FULLNAME]);
          return 0; :))-({0});
  if (flags==-1||!sizeof(args)) return USAGE("ed <datei> [<datei2>..]");
  _ed_cache=args;
  _ed_file();
  return 1;
}


//                             ###########
//############################## CP & MV ################################
//                             ###########

static void _cp_ask_copy(mixed *filedata,int dummy, int flags);
static void _cp_ask_overwrite(mixed *filedata, int mode, int flags);
static void _mv_ask_overwrite(mixed *filedata, int mode, int flags);

static mixed cp_file(mixed filedata,int move,int flags, mixed *do_delete)
{
  string source,dest;
  source=filedata[FULLNAME];
  dest=filedata[DESTNAME];
  if (source==dest) return ERROR(SAME_FILE,source,RET_FAIL);
  if (!MAY_READ(source)) return ERROR(NO_READ,source,RET_JUMP);
  if (!MAY_WRITE(dest)) return ERROR(NO_WRITE,dest,RET_JUMP);
  if (filedata[FILESIZE]==-1) return ERROR(DOESNT_EXIST,source,RET_JUMP);
  if (filedata[FILESIZE]==-2) // Quelle ist Verzeichnis
  {
    switch(file_size(dest))
    {
      case FSIZE_NOFILE:
        if (move)
        {
          if (rename(source,dest)) return ERROR(NO_CREATE_DIR,dest,RET_JUMP);
          if (flags&CP_V) printf(FILE_MOVED,source);
          return RET_JUMP;
        }
        if (!mkdir(dest)) return ERROR(NO_CREATE_DIR,dest,RET_JUMP);
        if (flags&CP_V) printf(DIR_CREATED,dest);
      case FSIZE_DIR:
        if (!move) return RET_OK;
        if (filedata[SUBDIRSIZE]>0) return RET_DELETE;
        if (!rmdir(source)) return ERROR(NO_DELETE,source,RET_FAIL);
        if (flags&MV_V) printf("mv: %s: Quellverzeichnis wurde "
                               "geloescht.\n",source);
        return RET_OK;    
      default:  return ERROR(NO_DIRS,dest,RET_JUMP);
    }
  }
  switch(file_size(dest))
  {
    case FSIZE_DIR: return ERROR(DEST_IS_DIR,dest,RET_FAIL);
    default:
      if (flags&CP_F)
      {
        if (!rm(dest)) return ERROR(DEST_NO_DELETE,dest,RET_FAIL);
        if (flags&CP_V) printf(FILE_DELETED,dest);
      }
      else
      {
        if (move) return #'_mv_ask_overwrite;
        else return #'_cp_ask_overwrite;
      }
    case FSIZE_NOFILE:
      if (move)
      {
        if (rename(source,dest)) return ERROR(NO_MOVE,source,RET_FAIL);
        if (flags&CP_V) printf(FILE_MOVED,source);
        return RET_OK;
      }
      if (copy_file(source,dest)) return ERROR(NO_COPY,source,RET_FAIL);
      if (flags&CP_V) printf(FILE_COPIED,source);
      return RET_OK;
  }
  return 0; // not-reached
}

static void _cp_ask_overwrite2(string input, mixed *filedata,
                               int interactive,int flags,int move)
{
  if (!sizeof(input)) input=" ";
  input=lower_case(input);
  switch(input[0])
  {
    case 'q':
      printf("%s abgebrochen!\n",move?"Bewegen":"Kopieren");
      return;
    case 'a':
      flags|=CP_F;
      if (!(flags&CP_I))
      {
        asynchron(filedata,#'cp_file,move,flags,0);
        return;
      }
    case 'y':
    case 'j':
      if (!rm(filedata[0][DESTNAME]))
        printf(DEST_NO_DELETE "Uebergehe Datei...\n",filedata[0][DESTNAME]);
      else
      {
        if (flags&CP_V) printf(FILE_DELETED,filedata[0][DESTNAME]);
        if (move)
        {
          if (rename(filedata[0][FULLNAME],filedata[0][DESTNAME]))
            printf(NO_MOVE "Uebergehe Datei...\n",filedata[0][FULLNAME]);
        }
        else
        {
          if (copy_file(filedata[0][FULLNAME],filedata[0][DESTNAME]))
            printf(NO_COPY "Uebergehe Datei...\n",filedata[0][FULLNAME]);
        }
      }
    case 'n':
      if (flags&CP_I)
        _cp_ask_copy(filedata[1+filedata[0][SUBDIRSIZE]..],move,flags);
      else
        asynchron(filedata[1+filedata[0][SUBDIRSIZE]..],
                                     #'cp_file,move,flags,0);
      return;
    default:
      printf("Kommando nicht verstanden.\n");
      _cp_ask_overwrite(filedata,interactive,flags);
      return;
  }

}

static void _cp_ask_overwrite(mixed *filedata, int interactive, int flags)
{
  printf("Die Datei '%s' existiert schon.\n",
         filedata[0][DESTNAME]);
  input_to("_cp_ask_overwrite2",INPUT_PROMPT,"Ueberschreiben? (j,n,a,q): ",
      filedata,interactive,flags,0);
  return;
}

static void _mv_ask_overwrite(mixed *filedata, int interactive, int flags)
{
  printf("Die Datei '%s' existiert schon.",
         filedata[0][DESTNAME]);
  input_to("_cp_ask_overwrite2",INPUT_PROMPT,"Ueberschreiben? (j,n,a,q): ",
      filedata,interactive,flags,1);
  return;
}

static void _cp_ask_copy2(string input,mixed *filedata,int mode,
                           int flags,int move)
{
  if (!sizeof(input)) input=" ";
  input=lower_case(input);
  switch(input[0])
  {
    case 'y':
    case 'j':
      if (mode==1)
      {
        if (!(flags&CP_F))
        {
          if (move) _mv_ask_overwrite(filedata,1,flags);
          else      _cp_ask_overwrite(filedata,1,flags);
          return;
        }
        if (!rm(filedata[0][DESTNAME]))
        {
          printf(DEST_NO_DELETE "Uebergehe Datei...\n",
                 filedata[0][DESTNAME]);
          _cp_ask_copy(filedata[1..],move,flags);
          return;
        }
        if (flags&CP_V) printf(FILE_DELETED,filedata[0][DESTNAME]);
      }
      if (mode<2)
      {
        if (move) rename(filedata[0][FULLNAME],filedata[0][DESTNAME]);
        else copy_file(filedata[0][FULLNAME],filedata[0][DESTNAME]);
        _cp_ask_copy(filedata[1..],move,flags);
        return;
      }
      if (mode==2)
      {
        if (move)
        {
          if (rename(filedata[0][FULLNAME],filedata[0][DESTNAME]))
            printf(NO_MOVE "Uebergehe Verzeichnis...\n",
                   filedata[0][FULLNAME]);
          _cp_ask_copy(filedata[1+filedata[0][SUBDIRSIZE]..],move,flags);
          return;
        }
        if (mkdir(filedata[0][DESTNAME]))
        {
          _cp_ask_copy(filedata[1..],0,flags);
          return;
        }
        printf(NO_CREATE_DIR "Uebergehe Verzeichnis...\n",
               filedata[0][DESTNAME]);
      }
    case 'n':
      _cp_ask_copy(filedata[(1+filedata[0][SUBDIRSIZE])..],0,flags);
      return;
    case 'q':
      printf("Kopieren abgebrochen!\n");
      return;
    case 'a':
      flags&=~CP_I;
      asynchron(filedata,#'cp_file,move,flags,0);
      return;
    default:
      printf("Kommando nicht verstanden.\n");
      _cp_ask_copy(filedata,0,flags);
      return;
  }
}

static void _cp_ask_copy(mixed *filedata,int move, int flags)
{
  mixed data;
  string dest,source;
  int delete_subs,jump;

  if(!sizeof(filedata))
  {
    printf("%s: abgeschlossen.\n",move?"mv":"cp");
    return; 
  }
  dest=filedata[0][DESTNAME];
  source=filedata[0][FULLNAME];
  switch(0)   // break wirkt damit wie ein goto end_of_switch
  {
    default:
    case 0: // Sinnlos, aber er compiliert sonst nicht :(
      jump=filedata[0][SUBDIRSIZE];
      if (source==dest)
      {
        printf(SAME_FILE,source);
        break;
      }
      if (!MAY_READ(source))
      {
        printf(NO_READ,source);
        break;
      }
      if (!MAY_WRITE(dest))
      {
        printf(NO_WRITE,dest);
        jump=0;
        break;
      }
      if (filedata[0][FILESIZE]==FSIZE_NOFILE)
      {
        printf(DOESNT_EXIST,source);
        break;
      }
      if (filedata[0][FILESIZE]==FSIZE_DIR) // Quelle ist Verzeichnis
      {
        if (file_size(dest)>FSIZE_NOFILE)
        {
          printf(NO_DIRS,dest);
          break;
        }
        if (file_size(dest)==FSIZE_DIR)
        {
          jump=0;
          break;
        }
        printf("Verzeichnis '%s' %s?\n",source,
               move?"bewegen":"kopieren");
        input_to("_cp_ask_copy2",INPUT_PROMPT, "(j,n,a,q) ",
            filedata,2,flags,move);
        return;
      }
      if (file_size(dest)==FSIZE_DIR)
      {
        printf(DEST_IS_DIR,dest);
        break;
      }
      printf("'%s' %s?\n",source,move?"bewegen":"kopieren");
      input_to("_cp_ask_copy2",INPUT_PROMPT, "(j,n,a,q) ",
          filedata,(file_size(dest)!=-1),flags,move);
      return;
  }
  _cp_ask_copy(filedata[1+jump..],move,flags);
  return;
}


static int _cp(string cmdline)
{
  mixed *args;
  int flags;
  string mask;
  string dest,*dest2;
  cmdline=_unparsed_args();
  args=parseargs(cmdline,&flags,CP_OPTS,0);
  if (flags==-1||!sizeof(args))
    return USAGE(query_verb()+" [-" CP_OPTS
                 "] <datei/verz> [<datei2/verz2> ... ] <ziel> [<maske>]");
  if (flags&CP_M)
  {
    mask=args[<1];
    args=args[0..<2];
  }
  if (!dest=to_filename(args[<1]))
     return USAGE(query_verb()+" [-" CP_OPTS
          "] <datei/verz> [<datei2/verz2> ... ] <ziel> [<maske>]");
  if (file_size(dest)==FSIZE_NOFILE)
  {
    dest2=explode(dest,"/");
    if (file_size(implode(dest2[0..<2],"/"))==FSIZE_DIR)
    {
      if (dest2[<1]=="*")
        dest=implode(dest2[0..<2],"/");
      else
        if (member(dest2[<1],'*')>-1||
            member(dest2[<1],'?')>-1)
         return notify_fail(
          sprintf("%s: Keine * und ? im Zielnamen erlaubt.\n",query_verb())),0;
    }
    else
      return notify_fail(
        sprintf("%s: Der angegebene Zielpfad existiert nicht.\n",
                query_verb())),0;
  }
  args=args[0..<2];
  if (file_size(dest)!=FSIZE_DIR && sizeof(args)>1)
    return notify_fail(
        sprintf("%s: Bei mehreren Quellen muss das Ziel ein Verzeichnis "
                "sein.\n",query_verb())),0;
  if (!sizeof(args=map(args,#'to_filename)-({0})))
    return USAGE(query_verb()+" [-" CP_OPTS
          "] <datei/verz> [<datei2/verz2> ... ] <ziel> [<maske>]");
  // DEBUG("DEST: " + dest + " : FLAGS: " + flags);
  args=file_list(args,MODE_CP,(flags&CP_R),dest+"/",mask);
  if (!sizeof(args))
    return notify_fail(sprintf("%s: Keine passenden Dateien gefunden.\n",
                               query_verb())),0;

  if (sizeof(args)>1&&(args[0][FILESIZE]>=0)&&file_size(dest)!=FSIZE_DIR)
      return notify_fail(
        sprintf("%s: Bei mehreren Quellen muss das Ziel ein Verzeichnis "
                "sein.\n",query_verb())),0;
  if (sizeof(args)==1&&file_size(dest)!=FSIZE_DIR)
    args[0][DESTNAME]=dest;
  if (!(flags&CP_I))
  {
    asynchron(args,#'cp_file,(query_verb()=="mv"),flags,0);
    return 1;
  }
  if (query_verb()=="cp")
    _cp_ask_copy(args,0,flags);
  else
    _cp_ask_copy(args,1,flags);
  return 1;
}

//                              #########
//############################### RMDIR #################################
//                              #########


//
// _rmdir: Verzeichnis loeschen
// cmdline: Kommandozeilenargumente
//

static int _rmdir(string cmdline)
{
  string dest,tmp;
  int flags;
  mixed *args;
  
  cmdline=_unparsed_args();
  args=parseargs(cmdline,&flags,RMDIR_OPTS,1);
  if (flags==-1||!sizeof(args))
    return USAGE("rmdir [-" RMDIR_OPTS "] <Verzeichnis>");
  if (sizeof(args)>1)
    return
    notify_fail("Mit 'rmdir' kann nur jeweils EIN Verzeichnis geloescht "
         "werden.\nDer Befehl 'rm' bietet erweiterte Moeglichkeiten.\n"),0;
  dest=args[0];
  if (dest!="/")
  {
    args=file_list(({dest}),MODE_RMDIR,0,"/");
    args=filter(args,(: ($1[FILESIZE]==FSIZE_DIR) :));
    if (!sizeof(args))
      return notify_fail(
        sprintf("rmdir: %s: Kein solches Verzeichnis gefunden.\n",dest)),0;
    if (sizeof(args)>1)
      return notify_fail(
                sprintf("rmdir: %s: Maske ist nicht eindeutig.\n",dest)),0;
    dest=args[0][FULLNAME];
    if (!MAY_WRITE(dest)) return ERROR(NO_WRITE,dest,1);
    if (!rmdir(dest))
    {
      if (sizeof((get_dir(dest+"/*")||({}))-({".",".."})))
        printf("rmdir: %s: Verzeichnis ist nicht leer.\n",dest);
    }
    else
    {
      if (flags&&RMDIR_V) printf(FILE_DELETED,dest);
    }
    return 1;
  }
  return ERROR(NO_DELETE,dest,1);
}

//                              #########
//############################### MKDIR #################################
//                              #########


//
// _mkdir: Verzeichnis erstellen
// cmdline: Kommandozeilenargumente
//

static int _mkdir(string cmdline)
{
  string dest,tmp;
  int flags,i;
  string *args;
  
  cmdline=_unparsed_args();
  args=parseargs(cmdline,&flags,MKDIR_OPTS,1);
  if (flags==-1) return 0;
  if (!sizeof(args))
    return USAGE("mkdir [-" MKDIR_OPTS "] <Verzeichnis>");
  if (sizeof(args)>1)
    return notify_fail("Mit 'mkdir' kann nur jeweils EIN Verzeichnis "
                       "erstellt werden.\n"),0;
  dest=args[0];
  
  if ((i=file_size(implode((args=explode(dest,"/"))[0..<2],"/")))==FSIZE_DIR)
  {
    if (!mkdir(dest)) return ERROR(NO_CREATE_DIR,dest,1);
    if (flags&MKDIR_V) printf(DIR_CREATED,dest,1);
    printf("mkdir: abgeschlossen.\n");
    return 1;
  }
  
  if (i==FSIZE_NOFILE)
  {
    if (flags&MKDIR_R)
    {
      if (mkdirp(dest) != 1)
        return ERROR(NO_CREATE_DIR,dest,1);
      if (flags&MKDIR_V)
        printf(DIR_CREATED,implode(args[0..i],"/"));
      printf("mkdir: abgeschlossen.\n");
      return 1;
    }
    return ERROR(DOESNT_EXIST,implode(args[0..<2],"/"),1);
  }
  return ERROR(ALREADY_EXISTS,dest,1);
}

//                               ######
//################################ RM ###################################
//                               ######

private void _rm_ask_delete(mixed *filedata, int flags);

static void _rm_ask_delete2(string input,mixed *filedata,int flags)
{
  int i;
  if (!sizeof(input)) input=" ";
  input=lower_case(input);
  switch(input[0])
  {
    case 'q':
      printf("Loeschen abgebrochen!\n");
      return;
    case 'y':
    case 'j':
      if (filedata[0][FILESIZE]==FSIZE_DIR)
      {
        if (i=filedata[0][SUBDIRSIZE]) // Dir-Eintrag nach hinten schieben
        {
          mixed temp;
          int j;
          temp=filedata[0];
          temp[SUBDIRSIZE]=0;
          for(j=0;j<i;j++) filedata[j]=filedata[j+1];
          filedata[j]=temp;
          _rm_ask_delete(filedata,flags);
          return;
        }
        if (!rmdir(filedata[0][FULLNAME]))
          printf(NO_DELETE,filedata[0][FULLNAME]);
        else if (flags&RM_V) printf(FILE_DELETED,filedata[0][FULLNAME]);
      }
      else // Datei existiert
      {
        if (!rm(filedata[0][FULLNAME]))
          printf(DEST_NO_DELETE "Uebergehe Datei...\n",
                 filedata[0][FULLNAME]);
        else if (flags&RM_V) printf(FILE_DELETED,filedata[0][FULLNAME]);
        
      }
    case 'n':
      _rm_ask_delete(filedata[1+filedata[0][SUBDIRSIZE]..],flags);
      return;
    default:
      printf("Kommando nicht verstanden.\n");
      _rm_ask_delete(filedata,flags);
      return;
  }
  return;
}

private void _rm_ask_delete(mixed *filedata, int flags)
{
  int i;
  mixed temp;
  if (!sizeof(filedata))
  {
    printf("rm: abgeschlossen.\n");
    return;
  }
  switch(filedata[0][FILESIZE])
  {
    case FSIZE_NOFILE:
      if (flags&RM_V) printf(DOESNT_EXIST,filedata[0][FULLNAME]);
      _rm_ask_delete(filedata[1..],flags);
      return;
    case FSIZE_DIR:
      if (i=filedata[0][SUBDIRSIZE])
        printf("Ins Verzeichnis '%s' hinabsteigen?\n",
          filedata[0][FULLNAME]);
      else
        printf("Verzeichnis '%s' loeschen?\n",
               filedata[0][FULLNAME]);
      input_to("_rm_ask_delete2",INPUT_PROMPT, "(j,n,q) ",
          filedata,flags);
      return;
    default:
      printf("'%s' loeschen? (j,n,q)\n",
         filedata[0][FULLNAME]);
      input_to("_rm_ask_delete2",INPUT_PROMPT, "(j,n,q) ",
          filedata,flags);
      return;
  }
}


private void rm_file(mixed filedata, mixed notused, int flags)
{
  string dest;
  dest=filedata[FULLNAME];
  if (!MAY_WRITE(dest))
  {
    printf(NO_WRITE,dest);
    return;
  }
  switch(filedata[FILESIZE])
  {
    case FSIZE_NOFILE:
      if (flags&RM_V) printf(DOESNT_EXIST,dest);
      return;
    case FSIZE_DIR:
      if (!rmdir(dest)) printf(DEST_NO_DELETE,dest);
      else
      {
        if (flags&RM_V) printf(FILE_DELETED,dest);
      }
      return;
    default:
      if (!rm(dest)) printf(DEST_NO_DELETE,dest);
      else
      {
        if (flags&RM_V) printf(FILE_DELETED,dest);
      }
      return;
  }
}

static int _rm(string cmdline)
{
  mixed *args,*args2;
  int flags,i;
  string mask;
  
  cmdline=_unparsed_args();
  args=parseargs(cmdline,&flags,RM_OPTS,0);
  if (flags==-1||!sizeof(args))
    return USAGE("rm [-" RM_OPTS
                 "] <datei/verz> [<datei2/verz2> ... ] [<maske>]");
  if (flags&RM_M)
  {
    mask=args[<1];
    args=args[0..<2];
  }
  args=map(args,#'to_filename)-({0});
  args=file_list(args,MODE_RM,(flags&RM_R),"/",mask);
  if (!(i=sizeof(args)))
    return printf("Keine passende Datei gefunden.\n"),1;
  if (!(flags&RM_I))
  {
    if (i>1) // Umdrehen
    {
      mixed temp;
      i>>=1;
      while(i)
      {
        temp=args[<(i--)];
        args[<(i+1)]=args[i];
        args[i]=temp;
      }
    }
    asynchron(args,#'rm_file,args,flags,0);
    return 1;
  }
  _rm_ask_delete(args,flags);
  return 1;
}
