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

/**
 * @title Chainlink CCIP Router Client Interface
 * @notice Interface for Chainlink CCIP Router Client
 * @dev This interface is based on Chainlink CCIP Router Client specification
 */
interface IRouterClient {
    /// @notice Represents the router's fee token
    enum TokenAmountType {
        Fiat,
        Native
    }

    /// @notice Represents a token amount and its type
    struct TokenAmount {
        address token;
        uint256 amount;
        TokenAmountType amountType;
    }

    /// @notice Represents a CCIP message
    struct EVM2AnyMessage {
        bytes receiver;
        bytes data;
        TokenAmount[] tokenAmounts;
        address feeToken;
        bytes extraArgs;
    }

    /// @notice Represents a CCIP message with source chain information
    struct Any2EVMMessage {
        bytes32 messageId;
        uint64 sourceChainSelector;
        bytes sender;
        bytes data;
        TokenAmount[] tokenAmounts;
    }

    /// @notice Emitted when a message is sent
    event MessageSent(
        bytes32 indexed messageId,
        uint64 indexed destinationChainSelector,
        address indexed sender,
        bytes receiver,
        bytes data,
        TokenAmount[] tokenAmounts,
        address feeToken,
        bytes extraArgs
    );

    /// @notice Emitted when a message is received
    event MessageReceived(
        bytes32 indexed messageId,
        uint64 indexed sourceChainSelector,
        address indexed sender,
        bytes data,
        TokenAmount[] tokenAmounts
    );

    /// @notice Sends a message to a destination chain
    /// @param destinationChainSelector The chain selector of the destination chain
    /// @param message The message to send
    /// @return messageId The ID of the sent message
    /// @return fees The fees required for the message
    /// @dev If feeToken is zero address, fees are paid in native token (ETH) via msg.value
    function ccipSend(
        uint64 destinationChainSelector,
        EVM2AnyMessage memory message
    ) external payable returns (bytes32 messageId, uint256 fees);

    /// @notice Gets the fee for sending a message
    /// @param destinationChainSelector The chain selector of the destination chain
    /// @param message The message to send
    /// @return fee The fee required for the message
    function getFee(
        uint64 destinationChainSelector,
        EVM2AnyMessage memory message
    ) external view returns (uint256 fee);

    /// @notice Gets the supported tokens for a destination chain
    /// @param destinationChainSelector The chain selector of the destination chain
    /// @return tokens The list of supported tokens
    function getSupportedTokens(
        uint64 destinationChainSelector
    ) external view returns (address[] memory tokens);
}

