#ifndef STORM_SETTINGS_MODULES_EXPLORATIONSETTINGS_H_
#define STORM_SETTINGS_MODULES_EXPLORATIONSETTINGS_H_

#include "src/settings/modules/ModuleSettings.h"

namespace storm {
    namespace settings {
        namespace modules {
            
            /*!
             * This class represents the exploration settings.
             */
            class ExplorationSettings : public ModuleSettings {
            public:
                // An enumeration of all available precomputation types.
                enum class PrecomputationType { Local, Global };
                
                // The available heuristics to choose the next state.
                enum class NextStateHeuristic { DifferenceProbabilitySum, Probability, Uniform };
                
                /*!
                 * Creates a new set of exploration settings that is managed by the given manager.
                 *
                 * @param settingsManager The responsible manager.
                 */
                ExplorationSettings(storm::settings::SettingsManager& settingsManager);
                
                /*!
                 * Retrieves whether local precomputation is to be used.
                 *
                 * @return True iff local precomputation is to be used.
                 */
                bool isLocalPrecomputationSet() const;
                
                /*!
                 * Retrieves whether global precomputation is to be used.
                 *
                 * @return True iff global precomputation is to be used.
                 */
                bool isGlobalPrecomputationSet() const;
                
                /*!
                 * Retrieves the selected precomputation type.
                 *
                 * @return The selected precomputation type.
                 */
                PrecomputationType getPrecomputationType() const;
                
                /*!
                 * Retrieves the number of exploration steps to perform until a precomputation is triggered.
                 *
                 * @return The number of exploration steps to perform until a precomputation is triggered.
                 */
                uint_fast64_t getNumberOfExplorationStepsUntilPrecomputation() const;

                /*
                 * Retrieves whether the option to perform a precomputation after a given number of sampled paths was set.
                 *
                 * @return True iff a precomputation after a given number of sampled paths is to be performed.
                 */
                bool isNumberOfSampledPathsUntilPrecomputationSet() const;
                
                /*!
                 * Retrieves the number of paths to sample until a precomputation is triggered.
                 *
                 * @return The the number of paths to sample until a precomputation is triggered.
                 */
                uint_fast64_t getNumberOfSampledPathsUntilPrecomputation() const;
                
                /*!
                 * Retrieves the selected next-state heuristic.
                 *
                 * @return The selected next-state heuristic.
                 */
                NextStateHeuristic getNextStateHeuristic() const;
                
                virtual bool check() const override;
                
                // The name of the module.
                static const std::string moduleName;
                
            private:
                // Define the string names of the options as constants.
                static const std::string precomputationTypeOptionName;
                static const std::string numberOfExplorationStepsUntilPrecomputationOptionName;
                static const std::string numberOfSampledPathsUntilPrecomputationOptionName;
                static const std::string nextStateHeuristicOptionName;
            };
        } // namespace modules
    } // namespace settings
} // namespace storm

#endif /* STORM_SETTINGS_MODULES_EXPLORATIONSETTINGS_H_ */