#include <map>
#include <string>
#include <cstdlib>
#include <cstdio>
#include <iostream>
#include <sstream>
#include <string>
#include "./socket.h"
#include "./filesystem.h"
#include <unistd.h>

#include "./json.h"

namespace FTP {
  static std::string FTPBasePath = "/tmp/mist/OnDemand/";

  enum Mode{
    MODE_STREAM,
  };
  //FTP::Mode enumeration

  enum Structure{
    STRU_FILE, STRU_RECORD,
  };
  //FTP::Structure enumeration

  enum Type{
    TYPE_ASCII_NONPRINT, TYPE_IMAGE_NONPRINT,
  };
  //FTP::Type enumeration

  enum Commands{
    CMD_NOCMD,
    CMD_NOOP,
    CMD_USER,
    CMD_PASS,
    CMD_QUIT,
    CMD_PORT,
    CMD_RETR,
    CMD_STOR,
    CMD_TYPE,
    CMD_MODE,
    CMD_STRU,
    CMD_EPSV,
    CMD_PASV,
    CMD_LIST,
    CMD_PWD,
    CMD_CWD,
    CMD_CDUP,
    CMD_DELE,
    CMD_RMD,
    CMD_MKD,
    CMD_RNFR,
    CMD_RNTO,
  };
  //FTP::Commands enumeration

  class User{
    public:
      User(Socket::Connection NewConnection, std::map<std::string, std::string> Credentials);
      ~User();
      int ParseCommand(std::string Command);
      bool LoggedIn();
      std::string NumToMsg(int MsgNum);
      Socket::Connection Conn;
    private:
      std::map<std::string, std::string> AllCredentials;
      std::string USER;
      std::string PASS;
      Mode MODE;
      Structure STRU;
      Type TYPE;
      int PORT;
      Socket::Server Passive;
      int MyPassivePort;
      Filesystem::Directory MyDir;
      std::string RNFR;
      std::vector<std::string> ActiveStreams;
  };
//FTP::User class

}//FTP Namespace