#ifndef STORM_SETTINGS_MODULES_BISIMULATIONSETTINGS_H_
#define STORM_SETTINGS_MODULES_BISIMULATIONSETTINGS_H_

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

#include "storm/storage/dd/bisimulation/SignatureMode.h"

namespace storm {
    namespace settings {
        namespace modules {
            
            /*!
             * This class represents the bisimulation settings.
             */
            class BisimulationSettings : public ModuleSettings {
            public:
                // An enumeration of all available bisimulation types.
                enum class BisimulationType { Strong, Weak };
                
                enum class QuotientFormat { Sparse, Dd };
                
                enum class ReuseMode { None, BlockNumbers };
                
                enum class InitialPartitionMode { Regular, Finer };
                
                /*!
                 * Creates a new set of bisimulation settings.
                 */
                BisimulationSettings();
                
                /*!
                 * Retrieves whether strong bisimulation is to be used.
                 *
                 * @return True iff strong bisimulation is to be used.
                 */
                bool isStrongBisimulationSet() const;

                /*!
                 * Retrieves whether weak bisimulation is to be used.
                 *
                 * @return True iff weak bisimulation is to be used.
                 */
                bool isWeakBisimulationSet() const;

                /*!
                 * Retrieves the format in which the quotient is to be extracted.
                 * NOTE: only applies to DD-based bisimulation.
                 */
                QuotientFormat getQuotientFormat() const;
                
                /*!
                 * Retrieves whether representatives for blocks are to be used instead of the block numbers.
                 * NOTE: only applies to DD-based bisimulation.
                 */
                bool isUseRepresentativesSet() const;
                
                /*!
                 * Retrieves the mode to compute signatures.
                 */
                storm::dd::bisimulation::SignatureMode getSignatureMode() const;
                
                /*!
                 * Retrieves the selected reuse mode.
                 */
                ReuseMode getReuseMode() const;
                
                /*!
                 * Retrieves the initial partition mode.
                 */
                InitialPartitionMode getInitialPartitionMode() 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 typeOptionName;
                static const std::string representativeOptionName;
                static const std::string quotientFormatOptionName;
                static const std::string signatureModeOptionName;
                static const std::string reuseOptionName;
                static const std::string initialPartitionOptionName;
            };
        } // namespace modules
    } // namespace settings
} // namespace storm

#endif /* STORM_SETTINGS_MODULES_BISIMULATIONSETTINGS_H_ */