#pragma once

#include <cstdio>
#include <string>
#include <cstring>
#include <vector>
#include <algorithm>
#include <map>
#include <sstream>
#include <fstream>

#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <pwd.h>
#include <grp.h>
#include <time.h>
#include <locale.h>
#include <langinfo.h>
#include <stdint.h>
#include <errno.h>

namespace Filesystem {
  enum DIR_Permissions {
    P_LIST = 0x01,//List
    P_RETR = 0x02,//Retrieve
    P_STOR = 0x04,//Store
    P_RNFT = 0x08,//Rename From/To
    P_DELE = 0x10,//Delete
    P_MKD = 0x20,//Make directory
    P_RMD = 0x40,//Remove directory
  };
  
  enum DIR_Show {
    S_NONE = 0x00,
    S_ACTIVE = 0x01,
    S_INACTIVE = 0x02,
    S_ALL = 0x03,
  };
  
  class Directory {
    public:
      Directory( std::string PathName = "", std::string BasePath = ".");
      ~Directory( );
      void Print( );
      bool IsDir( );
      std::string PWD( );
      std::string LIST( std::vector<std::string> ActiveStreams = std::vector<std::string>() );
      bool CWD( std::string Path );
      bool CDUP( );
      bool DELE( std::string Path );
      bool MKD( std::string Path );
      std::string RETR( std::string Path );
      void STOR( std::string Path, std::string Data );
      bool Rename( std::string From, std::string To );
      void SetPermissions( std::string PathName, char Permissions );
      bool HasPermission( char Permission );
      void SetVisibility( std::string Pathname, char Visible );
    private:
      bool ValidDir;
      bool SimplifyPath( );
      void FillEntries( );
      std::string MyBase;
      std::string MyPath;
      std::map< std::string, struct stat > Entries;
      std::map< std::string, char > MyPermissions;
      std::map< std::string, char > MyVisible;
  };//Directory Class
};//Filesystem namespace