/**
 * \example DirTree.cpp
 * Пример использования классов Server, Volume, Volumes,
 * Directory, Directories, Path, Exception.
 * Данный пример демонстрирует простейшую программу, которая выводит
 * на консоль дерево подкаталогов сервера, тома либо каталога.
 */

#include <stdio.h>
#include <memory.h>
#include "BGDNet.h"

using BGDNet::Server;
using BGDNet::Volume;
using BGDNet::Volumes;
using BGDNet::Directory;
using BGDNet::Directories;
using BGDNet::Path;
using BGDNet::Exception;

void srvTree( const Server* pSrv );
void volTree( const Volume* pVol );
void dirTree( const Directory* pDir, int level = 0 );

int main( int argc, char* argv[] )
{
  if (argc < 2)
  {
    puts("Usage: DirTree.exe <server_name> [<volume_name> [<dir_path>]]");
    return -1;
  }

  try
  {
    Server srv(argv[1]);
    if (2 == argc)
      srvTree(&srv); // Выводим содержимое всего сервера
    else
    {
      Volume vol(&srv, argv[2]);
      if (3 == argc)
        volTree(&vol); // Выводим содержимое тома на сервере
      else
      {
        // Выводим содержимое каталога
        Directory dir(&vol, Path(argv[3], NW_NS_LONG));
        dirTree(&dir);
      }
    }
  }
  catch (const Exception& e)
  {
    printf("ERROR: %s\n", e.what());
  }
  puts("----------");

  return 0;
}

void srvTree( const Server* pSrv )
{
  printf("Server %s:\n", (const char*)pSrv->name());
  puts("---------------");
  Volumes vlms;
  pSrv->getVolumes(&vlms);
  for (int i = 0; i < vlms.size(); ++i)
    volTree(vlms[i]);
}

void volTree( const Volume* pVol )
{
  printf(" Volume %s:\n", (const char*)pVol->name());
  puts(" ---------------");
  dirTree(pVol->root(), 2);
}

void dirTree( const Directory* pDir, int level )
{
  const int MAX_LEVEL = 50;
  if (level < MAX_LEVEL)
  {
    char buf[MAX_LEVEL + 1];
    memset(buf, ' ', level);
    buf[level] = '\0';
    Directories dirs;
    pDir->getSubdirs(&dirs);
    for (int i = 0; i < dirs.size(); ++i)
    {
      const Directory* pSubDir = dirs[i];
      printf("%s%s\n", buf, (const char*)pSubDir->name());
      dirTree(pSubDir, level + 1);
    }
  }
}
