#ifndef INCLUDED_ECA_CHAINSETUP_PARSER_H
#define INCLUDED_ECA_CHAINSETUP_PARSER_H

#include <vector>
#include <string>

class ECA_CHAINSETUP;
class AUDIO_IO;

/**
 * Functionality for parsing chainsetup 
 * option syntax.
 * 
 * Notes: Code was originally part of the 
 *        ECA_CHAINSETUP class.
 *
 * @author Kai Vehmanen
 */
class ECA_CHAINSETUP_PARSER {

 public:

  ECA_CHAINSETUP_PARSER(ECA_CHAINSETUP* csetup);

  // --
  // functions for std::string->state conversions

  /**
   * Returns the result of last call to interpret_option(), interpret_global_option() 
   * or interpret_object_option().
   *
   * @result true if options interpreted successfully, otherwise false
   */
  bool interpret_result(void) const { return(interpret_result_rep); }
  const std::string& interpret_result_verbose(void) const { return(interpret_result_verbose_rep); }

  void interpret_option(const std::string& arg);
  void interpret_global_option(const std::string& arg);
  void interpret_object_option(const std::string& arg);
  void interpret_options(const std::vector<std::string>& opts);

  void reset_interpret_status(void);
  void preprocess_options(std::vector<std::string>& opts) const;

  // --
  // functions for state->string conversions

  std::string inputs_to_string(void) const;
  std::string outputs_to_string(void) const;
  std::string chains_to_string(void) const;
  std::string midi_to_string(void) const;
  std::string general_options_to_string(void) const;

 private:

  // --
  // functions for std::string->state conversions

  void interpret_entry(void);
  void interpret_exit(const std::string& arg);
  void interpret_set_result(bool result, const std::string& verbose) { interpret_result_rep = result; interpret_result_verbose_rep = verbose; }
  void interpret_general_option (const std::string& arg);
  void interpret_processing_control (const std::string& arg);
  void interpret_audio_format (const std::string& arg);
  void interpret_chains (const std::string& arg);
  void interpret_chain_operator (const std::string& arg);
  void interpret_controller (const std::string& arg);
  void interpret_effect_preset (const std::string& arg);
  void interpret_audioio_device (const std::string& argu);
  void interpret_audioio_manager (const std::string& argu);
  void interpret_midi_device (const std::string& arg);
  bool interpret_match_found(void) const { return(istatus_rep); }

  // --
  // data members
  
  ECA_CHAINSETUP* csetup_repp;

  std::vector<AUDIO_IO*>* last_audio_add_vector_repp;
  AUDIO_IO* last_audio_object_repp;
  bool istatus_rep; /* whether we have found an option match? */
  bool interpret_result_rep; /* whether we found an option match with correct format? */
  std::string interpret_result_verbose_rep;

};

#endif
