"""lark_oapi.channel — high-level Feishu Channel capability layer.

Typical usage::

    import asyncio
    from lark_oapi.channel import FeishuChannel

    channel = FeishuChannel(app_id="cli_xxx", app_secret="***")

    @channel.on("message")
    async def on_message(msg):
        await channel.send(msg.conversation.chat_id, {"text": f"echo: {msg.content_text}"})

    asyncio.run(channel.connect())

The public surface is organized around :class:`FeishuChannel` — a single
class aligned with node-sdk's ``FeishuChannel``. All events fire through
``channel.on(event_name, handler)``; all sends/updates go through explicit
channel methods (``send`` / ``stream`` / ``update_card`` / ...).
"""

from .auth import (
    DeviceFlowClient,
    DeviceFlowInit,
    FileTokenStore,
    InMemoryTokenStore,
    TokenStore,
)
from .bot_identity import BotIdentity, fetch_bot_identity
from .card import CardBuilder, new_card
from .channel import FeishuChannel
from .config import (
    ChannelConfig,
    ChatQueueConfig,
    DedupConfig,
    DmPolicy,
    FooterConfig,
    GroupOverride,
    GroupPolicy,
    InboundConfig,
    MarkdownConverter,
    MediaCapabilities,
    NameCacheConfig,
    OutboundConfig,
    OversizeContext,
    PerChatReplyMode,
    PolicyConfig,
    RetryConfig,
    SafetyConfig,
    SenderIdentityField,
    StreamThrottleConfig,
    TextBatchConfig,
    TransportConfig,
    UATConfig,
)
from .events import ChannelEventName, Events
from .errors import (
    FeishuChannelError,
    FeishuChannelErrorCode,
    OutboundSendError,
    SendError,
    UATAuthError,
    classify_api_error,
    classify_error,
    classify_http_status,
    is_format_error,
    is_reply_target_gone,
    is_retryable,
)
from .identity import IdentityResolver, NameCache
from .normalize import (
    CommentEvent,
    CommentOperator,
    DedupStore,
    InMemoryDedupStore,
    InboundPipeline,
    flatten as flatten_content,
    make_event_key,
    make_message_key,
    normalize_comment,
    parse_message_content,
)
from .outbound import OutboundSender, infer_receive_id_type, markdown_to_post_ast
from .outbound.media.ssrf_guard import assert_public_url
from .outbound.streaming import Throttle, UpdateQueue, merge_streaming_text
from .outbound.streaming.card_stream import CardStreamController
from .outbound.streaming.markdown_stream import MarkdownStreamController
from .safety import (
    ChatPipeline,
    ChatPipelineManager,
    MediaBatchConfig,
    PolicyDecision,
    PolicyGate,
    ProcessingLock,
    RejectEvent,
    RejectReason,
    SafetyPipeline,
    SeenCache,
    is_stale,
    merge_batch,
)
from .types import (
    AudioContent,
    BotAddedEvent,
    BotLeaveEvent,
    CalendarContent,
    CardActionEvent,
    CardActionPayload,
    CardPayload,
    ChatInfo,
    Conversation,
    EventOperator,
    FileContent,
    FolderContent,
    GeneralCalendarContent,
    HongbaoContent,
    RedPacketContent,
    Identity,
    ImageContent,
    InboundMessage,
    InteractiveContent,
    LocationContent,
    MediaContent,
    MediaRef,
    MediaSource,
    Mention,
    MergeForwardContent,
    MergeForwardItem,
    MessageContent,
    MessageReadEvent,
    OutboundAudio,
    OutboundCard,
    OutboundFile,
    OutboundImage,
    OutboundMessage,
    OutboundPost,
    OutboundText,
    OutboundShareChat,
    OutboundShareUser,
    OutboundSticker,
    OutboundVideo,
    PostContent,
    ReactionEvent,
    ReplyRef,
    ResourceDescriptor,
    ResourceType,
    ReplyTargetGoneBehavior,
    SendOpts,
    SendResult,
    ShareCalendarEventContent,
    ShareChatContent,
    ShareUserContent,
    StickerContent,
    SystemContent,
    Target,
    TextContent,
    TodoContent,
    UAT,
    UnknownContent,
    UserAccessToken,
    VideoChatContent,
    VoteContent,
)

__all__ = [
    # Entry points
    "FeishuChannel",
    # Config
    "ChannelConfig",
    "ChatQueueConfig",
    "DedupConfig",
    "DmPolicy",
    "FooterConfig",
    "GroupOverride",
    "GroupPolicy",
    "InboundConfig",
    "MarkdownConverter",
    "MediaBatchConfig",
    "MediaCapabilities",
    "NameCacheConfig",
    "OutboundConfig",
    "OversizeContext",
    "PerChatReplyMode",
    "PolicyConfig",
    "RetryConfig",
    "SafetyConfig",
    "SenderIdentityField",
    "StreamThrottleConfig",
    "TextBatchConfig",
    "TransportConfig",
    "UATConfig",
    # Events
    "ChannelEventName",
    "Events",
    # Card builder (Python ergonomics helper)
    "CardBuilder",
    "CardStreamController",
    "MarkdownStreamController",
    "Throttle",
    "UpdateQueue",
    "new_card",
    "merge_streaming_text",
    # Auth
    "DeviceFlowClient",
    "DeviceFlowInit",
    "FileTokenStore",
    "InMemoryTokenStore",
    "TokenStore",
    # Dedup
    "DedupStore",
    "InMemoryDedupStore",
    "make_event_key",
    "make_message_key",
    # Identity
    "IdentityResolver",
    "NameCache",
    # Pipeline helpers
    "InboundPipeline",
    "OutboundSender",
    "infer_receive_id_type",
    "markdown_to_post_ast",
    "parse_message_content",
    # Safety
    "BotIdentity",
    "ChatPipeline",
    "ChatPipelineManager",
    "PolicyDecision",
    "PolicyGate",
    "ProcessingLock",
    "RejectEvent",
    "RejectReason",
    "SafetyPipeline",
    "SeenCache",
    "fetch_bot_identity",
    "is_stale",
    "merge_batch",
    # Errors
    "FeishuChannelError",
    "FeishuChannelErrorCode",
    "OutboundSendError",
    "SendError",
    "UATAuthError",
    "assert_public_url",
    "classify_api_error",
    "classify_error",
    "classify_http_status",
    "is_format_error",
    "is_reply_target_gone",
    "is_retryable",
    # Types
    "AudioContent",
    "BotAddedEvent",
    "BotLeaveEvent",
    "CalendarContent",
    "CardActionEvent",
    "CardActionPayload",
    "CardPayload",
    "ChatInfo",
    "CommentEvent",
    "CommentOperator",
    "Conversation",
    "EventOperator",
    "FileContent",
    "FolderContent",
    "GeneralCalendarContent",
    "HongbaoContent",
    "RedPacketContent",
    "Identity",
    "ImageContent",
    "InboundMessage",
    "InteractiveContent",
    "LocationContent",
    "MediaContent",
    "MediaRef",
    "MediaSource",
    "Mention",
    "MergeForwardContent",
    "MergeForwardItem",
    "MessageContent",
    "MessageReadEvent",
    "OutboundAudio",
    "OutboundCard",
    "OutboundFile",
    "OutboundImage",
    "OutboundMessage",
    "OutboundPost",
    "OutboundText",
    "OutboundShareChat",
    "OutboundShareUser",
    "OutboundSticker",
    "OutboundVideo",
    "PostContent",
    "ReactionEvent",
    "ReplyRef",
    "ResourceDescriptor",
    "ResourceType",
    "ReplyTargetGoneBehavior",
    "SendOpts",
    "SendResult",
    "ShareCalendarEventContent",
    "ShareChatContent",
    "ShareUserContent",
    "StickerContent",
    "SystemContent",
    "Target",
    "TextContent",
    "TodoContent",
    "UAT",
    "UnknownContent",
    "UserAccessToken",
    "VideoChatContent",
    "VoteContent",
    "flatten_content",
    "normalize_comment",
]
