// 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,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;
  }
}

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)
{
  string dest,source;
  int 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;
  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;
  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;
  }
}

private void _rm_ask_delete(mixed *filedata, int flags)
{
  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 (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;
  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;
}
