#ifndef cwPresetSel_h
#define cwPresetSel_h


namespace cw
{
  namespace preset_sel
  {
    typedef handle< struct preset_sel_str > handle_t;

    typedef struct preset_str
    {
      bool     playFl;      // play this preset
      unsigned preset_idx;  // preset index into preset_labelA[].
      unsigned order;
    } preset_t;

    typedef struct frag_str
    {
      unsigned         fragId;
      unsigned         endLoc;
      
      bool             dryFl;
      double           gain;
      double           wetDryGain;
      double           fadeOutMs;

      preset_t*        presetA;
      unsigned         presetN;

      bool             uiSelectFl;

      struct frag_str* link;
    } frag_t;


    enum {
      kEndLocVarId,
      kGainVarId,
      kFadeOutMsVarId,
      kWetGainVarId,
      
      kPresetOrderVarId,  //  preset order value
      kPresetSelectVarId,   //  select a preset to play
      kPlayEnableVarId,   // include in the segment to play
      kDryFlVarId,        // play this fragion dry
    };
    
    rc_t create(  handle_t& hRef, const object_t* cfg  );
    rc_t destroy( handle_t& hRef );

    unsigned    preset_count( handle_t h );
    const char* preset_label( handle_t h, unsigned preset_idx );
    
    unsigned      fragment_count( handle_t h );
    const frag_t* get_fragment_base( handle_t h );
    const frag_t* get_fragment( handle_t h, unsigned fragId );

    
    
    rc_t create_fragment( handle_t h, unsigned fragId, unsigned end_loc );
    rc_t delete_fragment( handle_t h, unsigned fragId );

    bool is_fragment_loc( handle_t h, unsigned loc );
    
    unsigned ui_select_fragment_id( handle_t h );
    void     ui_select_fragment(      handle_t h, unsigned fragId, bool selectFl );
    

    rc_t set_value( handle_t h, unsigned fragId, unsigned varId, unsigned presetId, bool     value );
    rc_t set_value( handle_t h, unsigned fragId, unsigned varId, unsigned presetId, unsigned value );
    rc_t set_value( handle_t h, unsigned fragId, unsigned varId, unsigned presetId, double   value );

    rc_t get_value( handle_t h, unsigned fragId, unsigned varId, unsigned presetId, bool&     valueRef );
    rc_t get_value( handle_t h, unsigned fragId, unsigned varId, unsigned presetId, unsigned& valueRef );
    rc_t get_value( handle_t h, unsigned fragId, unsigned varId, unsigned presetId, double&   valueRef );
    
    rc_t write( handle_t h, const char* fn );
    rc_t read(  handle_t h, const char* fn );
    
  }
}


#endif