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

/// @title ICouponBatch — ERC-1155 批量券接口
/// @notice 定义 CouponBatch ERC-1155 合约的外部调用接口
/// @dev ERC-1155 券仅限 Utility Track，不支持转售次数追踪
interface ICouponBatch {
    struct BatchCouponConfig {
        bool transferable;         // 是否可转让
        uint256 maxPrice;          // 价格上限（Utility = 面值）
        uint256 expiryDate;        // 到期日（Unix timestamp）
        uint256 minPurchase;       // 最低消费数量
        bool stackable;            // 是否可叠加使用
        bytes32[] allowedStores;   // 限定门店（空 = 任意门店）
        address issuer;            // 发行方地址
        uint256 faceValue;         // 面值（USDC 6位精度）
    }

    function getConfig(uint256 typeId) external view returns (BatchCouponConfig memory);
    function getFaceValue(uint256 typeId) external view returns (uint256);
    function totalSupply(uint256 typeId) external view returns (uint256);
    function balanceOf(address account, uint256 typeId) external view returns (uint256);

    /// @notice 铸造新券类型
    /// @return typeId 新创建的 ERC-1155 token type ID
    function mint(
        address to,
        uint256 faceValue,
        uint256 quantity,
        BatchCouponConfig calldata config
    ) external returns (uint256 typeId);

    /// @notice 销毁指定数量的券
    function burn(address account, uint256 typeId, uint256 amount) external;

    /// @notice ERC-1155 转移
    function safeTransferFrom(
        address from,
        address to,
        uint256 typeId,
        uint256 amount,
        bytes calldata data
    ) external;
}
