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

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

    // Fired after the status for a manager is updated
    event ManagerStatusUpdated(address manager, bool managerStatus);

    /**
    @notice fired when dividend are created/paid by the manager
     */
    event DividendPaid(
        uint256 propertyId,
        uint256 dividendId,
        uint256 ethAmount
    );

    /**
    @notice fired when an investor withdraw his dividend
     */
    event DividendWithdrawn(
        uint256 propertyId,
        uint256 dividendId,
        address investor,
        uint256 amount
    );

    /**
    @notice fired when ETH is drawn from the contract by manager
     */
    event ETHWithdrawn(address withdrawer, uint256 amount);

    /// @notice Sets status for a manager
    /// @param manager The address of manager for which the status is to be updated
    /// @param managerStatus The status for the manager
    /// @return status of the transaction
    function setManagerStatus(address manager, bool managerStatus)
        external
        returns (bool);

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

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

    /**
    @notice Used to pay/create dividend for a property
    @param  propertyId The ID of the property for which the dividend is being paid/created
    */
    function payDividend(uint256 propertyId) external payable;

    /**
    @notice Called to withdraw ETH dividend by investor
    @param dividendId The ID of the dividend from where the user wants to withdraw his dividend amount
     */
    function withdrawDividend(uint256 dividendId) public returns (bool);

    /**
    @notice Used to withdraw ETH from the contract by the manager
    @param amount The amount of ETH to withdraw | if amount is zero then all ETH balance is withdrawn from the contract
     */
    function withdrawETHByManager(uint256 amount) external;

    /**
    @notice Returns the complete list of all dividends
    @return The list of IDs of all dividends
    @return The list of totalDividendAmount of all dividends
    @return The list of totalInvestment of all dividends
    @return The list of dividendsAmountPaid of all dividends
     */
    function getAllDividendsList()
        public
        view
        returns (
            uint256[] memory propertyId,
            uint256[] memory totalDividendAmount,
            uint256[] memory totalInvestment,
            uint256[] memory dividendsAmountPaid
        );

    function getInvestorBalanceByDividendId(
        uint256 dividendId,
        address investor
    )
        public
        view
        returns (
            uint256 dividendBalanceAvailable,
            uint256 dividendBalanceWithdrawn
        );

}
/**
 @title IInvestment
 @dev This contract is an interface for Investment contract
 */
function setManagerStatus(address manager, bool managerStatus)
    external
    returns (bool);

/// @notice Sets status for a manager
/// @param manager The address of manager for which the status is to be updated
/// @param managerStatus The status for the manager
/// @return status of the transaction