/**
 * \example NDSTree.cpp
 * Пример использования классов Context, NDSObject, NDSObjects,
 * String, Exception.
 * Данный пример демонстрирует простейшую программу, которая выводит
 * на консоль дерево NDS начиная с указанного объекта либо корня. Для
 * всех пользователей выводятся их фамилии и номера телефонов.
 */

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

using BGDNet::Context;
using BGDNet::NDSObject;
using BGDNet::NDSObjects;
using BGDNet::String;
using BGDNet::Exception;

void subtree( const NDSObject* pObj, int level = 0 );

int main( int argc, char* argv[] )
{
  try
  {
    Context ctx;
    ctx.dckFlags(ctx.dckFlags() | DCV_TYPELESS_NAMES);
    const char* root = (2 == argc) ? argv[1] : "[Root]";
    NDSObject cont(ctx, root);
    subtree(&cont);
  }
  catch (const Exception& e)
  {
    printf("ERROR: %s\n", e.what());
  }
  puts("----------");

  return 0;
}

void subtree( const NDSObject* pObj, int level )
{
  const int MAX_LEVEL = 50;
  if (level < MAX_LEVEL)
  {
    char buf[MAX_LEVEL + 1];
    memset(buf, ' ', level);
    buf[level] = '\0';
    const char* base = pObj->baseClass().ptr();
    if (strcmp("User", base))
      printf("%s%s (%s)\n", buf, pObj->rdn().ptr(), base);
    else
    {
      String surname, phone;
      pObj->attr("Surname", &surname);
      pObj->attr("Telephone Number", &phone);
      printf("%s%s (%s) - %s, \"%s\"\n",
        buf, pObj->rdn().ptr(), base, surname.ptr(), phone.ptr());
    }
  
    if (pObj->isContainer())
    {
      NDSObjects sub;
      pObj->getSubordinates(&sub);
      for (int i = 0; i < sub.size(); ++i)
        subtree(sub[i], level + 2);
    }
  }
}
