#ifndef LAUNCHER_H
#define LAUNCHER_H
#include <iostream>
#include <data_acces.h>
class session_manager
{
public:
  /**
   * @brief session_manager::session_manager
   *  Object that guide a session
   * @param fd Client flie descriptor
   */
  session_manager(int fd);
  /**
   * @brief start_dialog
   * Start the default state, ready to listen petitions
   */
  void start_dialog();
  /**
   * @brief generate_package
   * Generate a package
   * @return Positive if the package has been installed well
   */
  int generate_package();
  /**
   * @brief remove
   * Remove a package
   * @return Positive if the package has been removed well
   */
  int remove();
  /**
   * @brief send_information
   * Send the actual packages generated whit these aplication
   */
  void send_information();
  /**
   * @brief send_user_info
   * Send the list of generated users and the privileges
   */
  void send_user_info();
  /**
   * @brief validate_pass
   * Recive an user and password and check if these mach with the users database
   * @return If the pass mach with the user, return true, if not, return false
   */
  bool validate_pass();
  /**
   * @brief create_user
   * Recive an user and password to create a user
   */
  void create_user();
  /**
   * @brief remove_user
   * Recive a user to remove it
   */
  void remove_user();
 private:
  /**
   * @brief appli_command
   * Execute emerge with the passed parameter
   * @param comand Parameter that recive emerge
   * @param n_package Name ot the package
   * @return The name of the package or err if he process fail
   */
  std::string appli_command(char comand[], char* n_package);
  /**
   * @brief read_data
   * Recive data from a socket
   * @param input Buffer to deposite the info
   * @param size Max size of a info readed
   * @return Number of bytes readed
   */
  virtual int read_data(char* input, int size);
  /**
   * @brief write_data
   * Write data using a socket
   * @param output
   * String to have te info to send
   * @return Number of bytes writed
   */
  virtual int write_data(std::string output);
  int fd;
  data_acces* data;
  std::string user;
  bool admin;
  std::string env;
};

#endif // LAUNCHER_H