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

#include "storm/settings/SettingsManager.h"
#include "storm/settings/Option.h"
#include "storm/settings/OptionBuilder.h"
#include "storm/settings/ArgumentBuilder.h"
#include "storm/settings/Argument.h"

namespace storm {
    namespace settings {
        namespace modules {
            
            const std::string ResourceSettings::moduleName = "resources";
            const std::string ResourceSettings::timeoutOptionName = "timeout";
            const std::string ResourceSettings::timeoutOptionShortName = "t";
            const std::string ResourceSettings::printTimeAndMemoryOptionName = "timemem";
            const std::string ResourceSettings::printTimeAndMemoryOptionShortName = "tm";
            const std::string ResourceSettings::signalWaitingTimeOptionName = "signal-timeout";

            ResourceSettings::ResourceSettings() : ModuleSettings(moduleName) {
                this->addOption(storm::settings::OptionBuilder(moduleName, timeoutOptionName, false, "If given, computation will abort after the timeout has been reached.").setIsAdvanced().setShortName(timeoutOptionShortName)
                                .addArgument(storm::settings::ArgumentBuilder::createUnsignedIntegerArgument("time", "Seconds after which to timeout.").setDefaultValueUnsignedInteger(0).build()).build());
                this->addOption(storm::settings::OptionBuilder(moduleName, printTimeAndMemoryOptionName, false, "Prints CPU time and memory consumption at the end.").setShortName(printTimeAndMemoryOptionShortName).build());
                this->addOption(storm::settings::OptionBuilder(moduleName, signalWaitingTimeOptionName, false, "Specifies how much time can pass until termination when receiving a termination signal.").setIsAdvanced()
                                        .addArgument(storm::settings::ArgumentBuilder::createUnsignedIntegerArgument("time", "Seconds after which to exit the program.").setDefaultValueUnsignedInteger(3).build()).build());
            }
            
            bool ResourceSettings::isTimeoutSet() const {
                return this->getOption(timeoutOptionName).getHasOptionBeenSet();
            }
            
            uint_fast64_t ResourceSettings::getTimeoutInSeconds() const {
                return this->getOption(timeoutOptionName).getArgumentByName("time").getValueAsUnsignedInteger();
            }
            
            bool ResourceSettings::isPrintTimeAndMemorySet() const {
                return this->getOption(printTimeAndMemoryOptionName).getHasOptionBeenSet();
            }

            uint_fast64_t ResourceSettings::getSignalWaitingTimeInSeconds() const {
                return this->getOption(signalWaitingTimeOptionName).getArgumentByName("time").getValueAsUnsignedInteger();
            }

        }
    }
}