#include <applicat.h>
#include <automask.h>
#include <defmask.h>
#include <prefix.h>
#include <progind.h>
#include <relation.h>
#include <utility.h>

#include "ba7200a.h"

///////////////////////////////////////////////////////////
// Main app
///////////////////////////////////////////////////////////

class TCopia_dati_app : public TSkeleton_application
{ 
  bool copy_dir(const char* src, const char* dst) const;

public:
  virtual void main_loop();
};

inline TCopia_dati_app& app() { return (TCopia_dati_app&)main_app(); }

///////////////////////////////////////////////////////////
// Step 1
///////////////////////////////////////////////////////////

class TCopia_dati_mask : public TAutomask
{
public:
  virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
  TCopia_dati_mask() : TAutomask("ba7200a") { }
};

bool TCopia_dati_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
{
  switch (o.dlg())
  {              
  case F01_DATIL:
    if (e == fe_close || e == fe_modify)
    {
      const TFilename n = o.get();
      const bool esiste = n.exist();
      if (strlen(n.name()) > 8)  
        return error_box("L'area dati ha un nome troppo lungo: %s", (const char*)n.name());
      if (esiste)
        return error_box("L'area dati in Lire esiste gi�");
    } else
    if (e == fe_init)
    {
      TFilename src, dst;
      src = prefix().get_studio();
      src.rtrim(1);
      set(F01_DATI, src);
      dst << src << "l";
      set(F01_DATIL, dst);
    }
    break;
  default: 
    break;
  }
  return TRUE;
}

int list_dirs(
  const char* filelist,      // @parm Stringa contenente la maschera di estrazione 
  TString_array& result)     // @parm Array da riempire con la lista dei file
  
{             
  TWait_cursor hourglass;
  TFilename dir(filelist);
  int i;
  
  for (i = dir.len()-1; i >= 0; i--)
    if (is_slash(dir[i]) || dir[i] == ':') break;
  
  TFilename mask(dir.mid(i+1));
  dir.cut(i > 0 ? i+1 : 0);   
  
  DIRECTORY curdir;
  xvt_fsys_get_dir(&curdir);
  
  if (dir.not_empty())                                             
  {
    DIRECTORY thedir; xvt_fsys_convert_str_to_dir(dir, &thedir);
    BOOLEAN ok = xvt_fsys_set_dir(&thedir);
    if (!ok) 
    {
      error_box("Impossibile entrare in %s", (const char*)dir);
      return 0;
    }  
  }  

  SLIST files = xvt_fsys_list_files(DIR_TYPE, "", TRUE);
  const int count = xvt_slist_count(files);
  
  for (SLIST_ELT e = xvt_slist_get_first(files); e; e = xvt_slist_get_next(files, e))
  { 
    const char* f = xvt_slist_get(files, e, NULL);
    if (*f != '.' && f[1] != ':')
    {
      if (dir.not_empty()) 
      {
        mask = dir; 
        mask.add(f);
        result.add(mask);
      }
      else 
        result.add(f);  
    }
  }
  
  xvt_slist_destroy(files);

  xvt_fsys_set_dir(&curdir);
  
  return count;
}

bool TCopia_dati_app::copy_dir(const char* src, const char* dst) const
{
  bool ok = TRUE;
  if (!fexist(dst))
    make_dir(dst);
    
  TString_array files;
  TFilename file1, file2;

  file1 = src; file1.add("*.*");
  list_dirs(file1, files);
  FOR_EACH_ARRAY_ROW(files, d, dir)
  {
    file1 = *dir;
    file2 = dst; file2.add(file1.name());
    ok &= copy_dir(file1, file2);
  }  
  files.destroy();

  file1 = src; file1.add("*.*");
  list_files(file1, files);
  TString str;
  str << "Copia da " << src << " a " << dst << "...";
  TProgind pi(files.items(), str, FALSE, TRUE);
  FOR_EACH_ARRAY_ROW(files, i, file)
  {
    pi.addstatus(1);

    file1 = *file;
    file2 = dst; file2.add(file1.name());
    ok &= fcopy(file1, file2);
  }  
  return ok;
}

///////////////////////////////////////////////////////////
// Main 
///////////////////////////////////////////////////////////

void TCopia_dati_app::main_loop()
{ 
  TCopia_dati_mask m;
  if (m.run() == K_ENTER)
  {
    prefix().set(NULL);
    const char* dir1 = m.get(F01_DATI);
    const char* dir2 = m.get(F01_DATIL);
    copy_dir(dir1, dir2);
  } 
}

int ba7200(int argc, char* argv[])
{  
  TCopia_dati_app ma;
  ma.run(argc, argv, "Copia Studio");
  
  return 0;
}