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

/**
 * @title IMintController
 * @notice Interface for minting ISO-4217 W tokens with reserve verification
 * @dev Minting requires: verified fiat settlement, custodian attestation, oracle quorum
 */
interface IMintController {
    /**
     * @notice Mint tokens (requires reserve verification)
     * @param token Token address
     * @param to Recipient address
     * @param amount Amount to mint (in token decimals)
     * @param settlementId Fiat settlement ID for audit trail
     */
    function mint(address token, address to, uint256 amount, bytes32 settlementId) external;

    /**
     * @notice Check if minting is allowed
     * @param token Token address
     * @param amount Amount to mint
     * @return canMint True if minting is allowed
     * @return reasonCode Reason if not allowed
     */
    function canMint(address token, uint256 amount) external view returns (bool canMint, bytes32 reasonCode);

    /**
     * @notice Check if oracle quorum is met
     * @param token Token address
     * @return quorumMet True if quorum is met
     */
    function isOracleQuorumMet(address token) external view returns (bool quorumMet);

    event MintExecuted(
        address indexed token,
        address indexed to,
        uint256 amount,
        bytes32 indexed settlementId
    );
    event MintRejected(address indexed token, uint256 amount, bytes32 reasonCode);
}
