contract IInvestment {
    /**
    @dev fired on investment state change
    */
    event StateChanged(uint256 state);

    /**
    @dev fired when user invests
     */
    event Invested(
        uint256 propertyId,
        address investor,
        address tokenAddress,
        uint256 tokens
    );

    /**
    @dev fired when property is set by owner
     */
    event PropertySet(address property);

    /**
    @dev fired when the premium status of a use is changed
     */
    event PremiumStatusOfUserChanged(address user, bool status);

    /**
    @dev fired when allocation token state is changed
     */
    event AllocationTokenStateChanged(address allocationToken, bool state);

    /**
    @notice it invests allocation tokens to buy property
    @param propertyId ID of the property to make investment into
    @param tokenAddress address of the token using which the investment is made
    @param tokens the amount of tokens to invest
     */
    function invest(uint256 propertyId, address tokenAddress, uint256 tokens)
        external;

    /**
    @notice this function sets/changes state of this smart contract and owner can call it
    @param state it can be either 0 (Inactive) or 1 (Active)
     */
    function setState(uint256 state) external;

    /**
    @notice is called by owner to set property address
    @param _property it is the address of the property
     */
    function setProperty(IProperties _property) external;

    /**
    @notice is called by owner to change the allocation token state
    @param _token it is the address of the allocation token
    @param _state it is the state of the allocation token
     */

    /**
    @notice is called by owner to change the allocation token state
    @param _token it is the address of the allocation token
    @param _state it is the state of the allocation token
    @param _isPremium sets true if the set is premium
     */
    function setAllocationTokenState(
        address _token,
        bool _state,
        bool _isPremium
    ) external;

    /**
    @notice It changes premium status of a user
    @param user The address of the user
    @param status The premium status of the user */
    function changePremiumStatusOfUser(address user, bool status) public;

}
/**
 @title IInvestment
 @dev This contract is an interface for Investment contract
 */
function invest(uint256 propertyId, address tokenAddress, uint256 tokens)
        external;
/**
 @notice it invests allocation tokens to buy property
 @param propertyId ID of the property to make investment into
 @param tokenAddress address of the token using which the investment is made
 @param tokens the amount of tokens to invest
 */