#ifndef __PRESET_LOADER_HPP
#define __PRESET_LOADER_HPP

#include <string> // used for path / filename stuff
#include <memory> // for auto pointers
#include <sys/types.h>

#ifdef WIN32
#include "win32-dirent.h"
#endif

#ifdef LINUX
#include <dirent.h>
#endif

#ifdef MACOS
#include <dirent.h>
#endif

#include <vector>
#include <map>
#include "PresetFactoryManager.hpp"


class Preset;
class PresetFactory;


class PresetLoader {
public:

  /// Initializes the preset loader with the target directory specified 
  PresetLoader(int gx, int gy, std::string dirname);

  ~PresetLoader();

  /// Load a preset by specifying it's unique identifier given when the preset url
  /// was added to this loader  
  std::auto_ptr<Preset> loadPreset(unsigned int index) const;
  std::auto_ptr<Preset> loadPreset ( const std::string & url )  const;
  /// Add a preset to the loader's collection.
  /// \param url an url referencing the preset
  /// \param presetName a name for the preset
  /// \param rating an integer representing the goodness of the preset
  /// \returns The unique index assigned to the preset in the collection. Used with loadPreset
  unsigned int addPresetURL ( const std::string & url, const std::string & presetName, const RatingList & ratings);

  /// Add a preset to the loader's collection.
  /// \param index insertion index
  /// \param url an url referencing the preset
  /// \param presetName a name for the preset
  /// \param rating an integer representing the goodness of the preset
  void insertPresetURL (unsigned int index, const std::string & url, const std::string & presetName, const RatingList & ratings);

  /// Clears all presets from the collection
  inline void clear() { 
    _entries.clear(); _presetNames.clear(); 
    _ratings = std::vector<RatingList>(TOTAL_RATING_TYPES, RatingList());
    clearRatingsSum();
  }

  inline void clearRatingsSum() {
    _ratingsSums = std::vector<int>(TOTAL_RATING_TYPES, 0);
  }

  const std::vector<RatingList> & getPresetRatings() const;   
  const std::vector<int> & getPresetRatingsSums() const;

  /// Removes a preset from the loader
  /// \param index the unique identifier of the preset url to be removed
  void removePreset(unsigned int index);

  /// Sets the rating of a preset to a new value
  void setRating(unsigned int index, int rating, const PresetRatingType ratingType);

  /// Get a preset rating given an index
  int getPresetRating ( unsigned int index, const PresetRatingType ratingType) const;

  /// Get a preset url given an index
  const std::string & getPresetURL ( unsigned int index) const;

  /// Get a preset name given an index
  const std::string & getPresetName ( unsigned int index) const;

  /// Returns the number of presets in the active directory 
  inline std::size_t size() const {
    return _entries.size();
  }

  /// Sets the directory where the loader will search for files 
  void setScanDirectory(std::string pathname);

  /// Returns the directory path associated with this preset chooser
  inline const std::string & directoryName() const {
    return _dirname;
  }

  /// Rescans the active preset directory
  void rescan();
  void setPresetName(unsigned int index, std::string name);

private:
  void handleDirectoryError();

  std::string                   _dirname;
  DIR                           *_dir;
  std::vector<int>              _ratingsSums;
  mutable PresetFactoryManager  _presetFactoryManager;

  // vector chosen for speed, but not great for reverse index lookups
  std::vector<std::string>      _entries;
  std::vector<std::string>      _presetNames;

  // Indexed by ratingType, preset position.
  std::vector<RatingList>       _ratings;
};

#endif
