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

/**
 * @title IChainAdapter
 * @notice Interface for chain-specific bridge adapters
 * @dev All chain adapters must implement this interface
 */
interface IChainAdapter {
    enum BridgeStatus {
        Pending,
        Locked,
        Confirmed,
        Completed,
        Failed,
        Cancelled
    }

    struct BridgeRequest {
        address sender;
        address token;
        uint256 amount;
        bytes destinationData;      // Chain-specific destination (address, account, etc.)
        bytes32 requestId;
        BridgeStatus status;
        uint256 createdAt;
        uint256 completedAt;
    }

    /**
     * @notice Get chain type identifier
     */
    function getChainType() external pure returns (string memory);

    /**
     * @notice Get chain identifier (chainId for EVM, string for non-EVM)
     */
    function getChainIdentifier() external view returns (uint256 chainId, string memory identifier);

    /**
     * @notice Validate destination address/identifier for this chain
     */
    function validateDestination(bytes calldata destination) external pure returns (bool);

    /**
     * @notice Initiate bridge operation
     * @param token Token address (address(0) for native)
     * @param amount Amount to bridge
     * @param destination Chain-specific destination data
     * @param recipient Recipient address/identifier
     * @return requestId Unique request identifier
     */
    function bridge(
        address token,
        uint256 amount,
        bytes calldata destination,
        bytes calldata recipient
    ) external payable returns (bytes32 requestId);

    /**
     * @notice Get bridge request status
     */
    function getBridgeStatus(bytes32 requestId) 
        external view returns (BridgeRequest memory);

    /**
     * @notice Cancel pending bridge (if supported)
     */
    function cancelBridge(bytes32 requestId) external returns (bool);

    /**
     * @notice Estimate bridge fee
     */
    function estimateFee(
        address token,
        uint256 amount,
        bytes calldata destination
    ) external view returns (uint256 fee);

    /**
     * @notice Check if adapter is active
     */
    function isActive() external view returns (bool);
}
