// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

/**
 * @notice On-chain GRU Monetary Policy mint gate (coverage, velocity zone, utilization).
 */
interface IGruMonetaryPolicyGate {
    enum VelocityZone {
        Green,
        AmberLow,
        AmberHigh,
        Red,
        Black
    }

    struct MetricsSnapshot {
        uint256 coverageRatioBps;
        uint256 m1ToM00Utilization; // whole number ratio numerator (e.g. 25 = 25:1)
        VelocityZone velocityZone;
        uint256 metricsUpdatedAt;
        bool issuancePaused;
    }

    event MetricsUpdated(uint256 coverageRatioBps, uint256 m1ToM00Utilization, VelocityZone zone, bool issuancePaused);
    event PolicyGateSet(address indexed token, bool enabled);

    function metrics() external view returns (MetricsSnapshot memory);

    function tokenGateEnabled(address token) external view returns (bool);

    function setTokenGate(address token, bool enabled) external;

    function updateMetrics(
        uint256 coverageRatioBps,
        uint256 m1ToM00Utilization,
        VelocityZone zone,
        bool issuancePaused
    ) external;

    function canMint(address token, uint256 amount) external view returns (bool);

    function canMintReason(address token, uint256 amount) external view returns (bool ok, bytes32 reason);
}
