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

/**
 * @title IComplianceGuard
 * @notice Interface for compliance guard enforcing ISO-4217 W token rules
 * @dev Ensures GRU isolation, money multiplier = 1.0, reserve constraints
 */
interface IComplianceGuard {
    /**
     * @notice Validate mint operation
     * @param currencyCode ISO-4217 currency code
     * @param amount Amount to mint
     * @param currentSupply Current token supply
     * @param verifiedReserve Verified reserve balance
     * @return isValid True if mint is compliant
     * @return reasonCode Reason if not compliant
     */
    function validateMint(
        string memory currencyCode,
        uint256 amount,
        uint256 currentSupply,
        uint256 verifiedReserve
    ) external view returns (bool isValid, bytes32 reasonCode);

    /**
     * @notice Validate that money multiplier = 1.0
     * @dev Hard constraint: m = 1.0 (no fractional reserve)
     * @param reserve Reserve balance
     * @param supply Token supply
     * @return isValid True if multiplier = 1.0
     */
    function validateMoneyMultiplier(uint256 reserve, uint256 supply) external pure returns (bool isValid);

    /**
     * @notice Check if currency is ISO-4217 compliant
     * @param currencyCode Currency code to validate
     * @return isISO4217 True if ISO-4217 compliant
     */
    function isISO4217Compliant(string memory currencyCode) external pure returns (bool isISO4217);

    /**
     * @notice Check if operation violates GRU isolation
     * @param currencyCode Currency code
     * @return violatesIsolation True if GRU linkage detected
     */
    function violatesGRUIsolation(string memory currencyCode) external pure returns (bool violatesIsolation);

    /**
     * @notice Validate reserve sufficiency
     * @param reserve Reserve balance
     * @param supply Token supply
     * @return isSufficient True if reserve >= supply
     */
    function isReserveSufficient(uint256 reserve, uint256 supply) external pure returns (bool isSufficient);

    event ComplianceCheckPassed(string indexed currencyCode, bytes32 checkType);
    event ComplianceCheckFailed(string indexed currencyCode, bytes32 checkType, bytes32 reasonCode);
}
