contract BasicFunctionality is
    OwnerController,
    AdminController,
    TimerController,
    ReentrancyGuard,
    BasicWithdraw
{
    /// @dev the cost of purchasing a token, in weic
    uint256 public costInWei;

    /// @dev is the contract enabled
    bool public isEnabled = false;

    /// @dev keeps track of the purchased tokens
    using Counters for Counters.Counter;
    Counters.Counter internal counter;

    constructor(Props memory props)
        ReentrancyGuard()
        OwnerController(props.owner)
    {
        costInWei = props.costInWei;
    }

    /// @dev makes sure the contract is enabled
    modifier onlyEnabled() {
        require(isEnabled, "not enabled");
        _;
    }

    /// @dev starts the contract by enabling it and starting the timer
    function start(uint256 _drawLengthHours) external onlyAdmin {
        _startTimer(_drawLengthHours);
        isEnabled = true;
    }

    /// @dev allows to withdraw all funds from the contract
    function withdraw(address payable to) external payable onlyOwner {
        _withdrawAllFunds(to);
    }

    /// @dev set a new cost
    function setCostInWei(uint256 _costInWei) external onlyAdmin {
        costInWei = _costInWei;
    }

    /// @dev set a new isEnabled
    function setIsEnabled(bool _isEnabled) external onlyAdmin {
        isEnabled = _isEnabled;
    }

    /// @dev set a new draw length in hours
    function setDrawLengthHours(uint256 _hours) external onlyAdmin {
        _setTimerEndsInHours(_hours);
    }

    function _incrementCount() internal {
        counter.increment();
    }

    /// @dev is the sender an admin
    function _isAdmin()
        internal
        view
        virtual
        override(AdminController)
        returns (bool)
    {
        return isOwner();
    }
}
/**
 * @dev SafeListBase is a base contract to create safe list and admin controlled NFT contracts,
 */
function setCostInWei(uint256 _costInWei) external onlyAdmin {
    costInWei = _costInWei;
}

/// @dev set a new cost