/* +------------------------------------------------------------------------+
   |                     Mobile Robot Programming Toolkit (MRPT)            |
   |                          https://www.mrpt.org/                         |
   |                                                                        |
   | Copyright (c) 2005-2024, Individual contributors, see AUTHORS file     |
   | See: https://www.mrpt.org/Authors - All rights reserved.               |
   | Released under BSD License. See: https://www.mrpt.org/License          |
   +------------------------------------------------------------------------+ */

#include <mrpt/core/exceptions.h>
#include <mrpt/system/CDirectoryExplorer.h>
#include <mrpt/system/filesystem.h>

#include <iostream>
#include <string>

using namespace mrpt;
using namespace mrpt::system;
using namespace std;

// ------------------------------------------------------
//				TestDirExplorer
// ------------------------------------------------------
void TestDirExplorer()
{
  CDirectoryExplorer::TFileInfoList lst;

  string path(mrpt::system::getcwd());
  printf("Exploring path: %s\n", path.c_str());

  CDirectoryExplorer::explore(path, FILE_ATTRIB_ARCHIVE | FILE_ATTRIB_DIRECTORY, lst);

  printf("Found %i files:\n", (unsigned int)lst.size());

  for (CDirectoryExplorer::TFileInfoList::iterator it = lst.begin(); it != lst.end(); ++it)
  {
    printf("name: %s\n", it->name.c_str());
    printf("wholePath: %s\n", it->wholePath.c_str());
    printf("isDir: %c\n", it->isDir ? 'Y' : 'N');
    printf("size: %lu bytes\n", (unsigned long)it->fileSize);
    printf("-----------------------\n");
  }
}

// ------------------------------------------------------
//				TestFileNames
// ------------------------------------------------------
void TestFileNames()
{
  // Test extractFileName
  string S;

  S = "foo.bar";
  cout << "file: " << S << " -> extractFileName : " << mrpt::system::extractFileName(S) << endl;

  S = "foo.b";
  cout << "file: " << S << " -> extractFileName : " << mrpt::system::extractFileName(S) << endl;

  S = "foo.bardotbar.too";
  cout << "file: " << S << " -> extractFileName : " << mrpt::system::extractFileName(S) << endl;

  S = "foo";
  cout << "file: " << S << " -> extractFileName : " << mrpt::system::extractFileName(S) << endl;

  S = "foo.";
  cout << "file: " << S << " -> extractFileName : " << mrpt::system::extractFileName(S) << endl;
}

// ------------------------------------------------------
//						MAIN
// ------------------------------------------------------
int main()
{
  try
  {
    TestDirExplorer();
    TestFileNames();

    return 0;
  }
  catch (const std::exception& e)
  {
    std::cerr << "MRPT error: " << mrpt::exception_to_str(e) << std::endl;
    return -1;
  }
}
