#pragma once

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

namespace storm {
    namespace settings {
        namespace modules {
            
            /*!
             * This class represents the resource settings.
             */
            class ResourceSettings : public ModuleSettings {
            public:
                
                /*!
                 * Creates a new set of general settings.
                 */
                ResourceSettings();

                /*!
                 * Retrieves whether time and memory consumption shall be printed at the end of a run.
                 *
                 * @return True iff the option was set.
                 */
                bool isPrintTimeAndMemorySet() const;
                
                /*!
                 * Retrieves whether the timeout option was set.
                 *
                 * @return True if the timeout option was set.
                 */
                bool isTimeoutSet() const;
                
                /*!
                 * Retrieves the time after which the computation has to be aborted in case the timeout option was set.
                 *
                 * @return The number of seconds after which to timeout.
                 */
                uint_fast64_t getTimeoutInSeconds() const;

                /*!
                 * Retrieves the waiting time of the program after a signal.
                 * If a signal to abort is handled, the program should terminate.
                 * However, it waits the given number of seconds before it is killed to allow for printing preliminary results.
                 *
                 * @return The number of seconds after which to exit the program.
                 */
                uint_fast64_t getSignalWaitingTimeInSeconds() const;

                // The name of the module.
                static const std::string moduleName;

            private:
                // Define the string names of the options as constants.
                static const std::string timeoutOptionName;
                static const std::string timeoutOptionShortName;
                static const std::string printTimeAndMemoryOptionName;
                static const std::string printTimeAndMemoryOptionShortName;
                static const std::string signalWaitingTimeOptionName;
            };
        }
    }
}