import { ChannelID } from '../models/channel-id.js';
import { Account, ConversationAccount } from '../models/account.js';
import { ConversationReference } from '../models/conversation/conversation-reference.js';
import { Entity } from '../models/entity/index.js';
import { ChannelData } from '../models/channel-data/index.js';
import { MeetingInfo } from '../models/meeting/meeting-info.js';
import { ChannelInfo } from '../models/channel-data/channel-info.js';
import { TeamInfo } from '../models/channel-data/team-info.js';
import { NotificationInfo } from '../models/channel-data/notification-info.js';
import { CitationAppearance } from '../models/entity/citation-entity.js';
import { TenantInfo } from '../models/channel-data/tenant-info.js';
import '../models/membership-source.js';
import '../models/membership-source-types.js';
import '../models/membership-types.js';
import '../models/role.js';
import '../models/entity/ai-message-entity.js';
import '../models/entity/message-entity.js';
import '../models/entity/client-info-entity.js';
import '../models/entity/mention-entity.js';
import '../models/entity/product-info-entity.js';
import '../models/entity/sensitive-usage-entity.js';
import '../models/entity/stream-info-entity.js';
import '../models/channel-data/feedback-loop.js';
import '../models/channel-data/on-behalf-of.js';
import '../models/channel-data/settings.js';
import '../models/meeting/meeting-details.js';

interface IActivity<T extends string = string> {
    /**
     * Contains the type of the activity.
     */
    readonly type: T;
    /**
     * Contains an ID that uniquely identifies the activity on the channel.
     */
    id: string;
    /**
     * Contains the URL that specifies the channel's service endpoint. Set by the channel.
     */
    serviceUrl?: string;
    /**
     * Contains the date and time that the message was sent, in UTC, expressed in ISO-8601 format.
     */
    timestamp?: Date;
    /**
     * A locale name for the contents of the text field.
     * The locale name is a combination of an ISO 639 two- or three-letter culture code associated
     * with a language
     * and an ISO 3166 two-letter subculture code associated with a country or region.
     * The locale name can also correspond to a valid BCP-47 language tag.
     */
    locale?: string;
    /**
     * Contains the local date and time of the message, expressed in ISO-8601 format.
     *
     * For example, 2016-09-23T13:07:49.4714686-07:00.
     */
    localTimestamp?: Date;
    /**
     * Contains an ID that uniquely identifies the channel. Set by the channel.
     */
    channelId: ChannelID;
    /**
     * Identifies the sender of the message.
     */
    from: Account;
    /**
     * Identifies the conversation to which the activity belongs.
     */
    conversation: ConversationAccount;
    /**
     * A reference to another conversation or activity.
     */
    relatesTo?: ConversationReference;
    /**
     * Identifies the recipient of the message.
     */
    recipient: Account;
    /**
     * Contains the ID of the message to which this message is a reply.
     */
    replyToId?: string;
    /**
     * Represents the entities that were mentioned in the message.
     */
    entities?: Entity[];
    /**
     * Contains channel-specific content.
     */
    channelData?: ChannelData;
    /**
     * Information about the channel in which the message was sent.
     */
    get channel(): ChannelInfo | undefined;
    /**
     * Information about the team in which the message was sent.
     */
    get team(): TeamInfo | undefined;
    /**
     * Information about the tenant in which the message was sent.
     */
    get meeting(): MeetingInfo | undefined;
    /**
     * Notification settings for the message.
     */
    get notification(): NotificationInfo | undefined;
    /**
     * is this a streaming activity
     */
    isStreaming(): boolean;
}
declare class Activity<T extends string = string> implements IActivity<T> {
    /**
     * Contains the type of the activity.
     */
    readonly type: T;
    /**
     * Contains an ID that uniquely identifies the activity on the channel.
     */
    id: string;
    /**
     * Contains the URL that specifies the channel's service endpoint. Set by the channel.
     */
    serviceUrl?: string;
    /**
     * Contains the date and time that the message was sent, in UTC, expressed in ISO-8601 format.
     */
    timestamp?: Date;
    /**
     * A locale name for the contents of the text field.
     * The locale name is a combination of an ISO 639 two- or three-letter culture code associated
     * with a language
     * and an ISO 3166 two-letter subculture code associated with a country or region.
     * The locale name can also correspond to a valid BCP-47 language tag.
     */
    locale?: string;
    /**
     * Contains the local date and time of the message, expressed in ISO-8601 format.
     *
     * For example, 2016-09-23T13:07:49.4714686-07:00.
     */
    localTimestamp?: Date;
    /**
     * Contains an ID that uniquely identifies the channel. Set by the channel.
     */
    channelId: ChannelID;
    /**
     * Identifies the sender of the message.
     */
    from: Account;
    /**
     * Identifies the conversation to which the activity belongs.
     */
    conversation: ConversationAccount;
    /**
     * A reference to another conversation or activity.
     */
    relatesTo?: ConversationReference;
    /**
     * Identifies the recipient of the message.
     */
    recipient: Account;
    /**
     * Contains the ID of the message to which this message is a reply.
     */
    replyToId?: string;
    /**
     * Represents the entities that were mentioned in the message.
     */
    entities?: Entity[];
    /**
     * Contains channel-specific content.
     */
    channelData?: ChannelData;
    /**
     * Information about the tenant in which the message was sent.
     */
    get tenant(): TenantInfo | undefined;
    /**
     * Information about the channel in which the message was sent.
     */
    get channel(): ChannelInfo | undefined;
    /**
     * Information about the team in which the message was sent.
     */
    get team(): TeamInfo | undefined;
    /**
     * Information about the tenant in which the message was sent.
     */
    get meeting(): MeetingInfo | undefined;
    /**
     * Notification settings for the message.
     */
    get notification(): NotificationInfo | undefined;
    constructor(value: Pick<IActivity<T>, 'type'> & Partial<Omit<IActivity<T>, 'type'>>);
    static from(activity: IActivity): Activity<string>;
    toInterface(): IActivity;
    clone(options?: Omit<Partial<IActivity>, 'type'>): Activity<string>;
    withId(value: string): this;
    withReplyToId(value: string): this;
    withChannelId(value: ChannelID): this;
    withFrom(value: Account): this;
    withConversation(value: ConversationAccount): this;
    withRelatesTo(value: ConversationReference): this;
    /**
     * Set the recipient of this activity, optionally marking it as a targeted message.
     * Targeted messages are ephemeral to the specified recipient in a shared conversation.
     * @param value - The recipient account
     * @param isTargeted - If true, marks this as a targeted message visible only to the recipient (default: false)
     * @returns this instance for chaining
     *
     * @experimental This API is in preview and may change in the future.
     * Diagnostic: ExperimentalTeamsTargeted
     */
    withRecipient(value: Account, isTargeted?: boolean): this;
    withServiceUrl(value: string): this;
    withTimestamp(value: Date): this;
    withLocale(value: string): this;
    withLocalTimestamp(value: Date): this;
    withChannelData(value: ChannelData): this;
    /**
     * Add an entity.
     */
    addEntity(value: Entity): this;
    /**
     * Add multiple entities
     */
    addEntities(...value: Entity[]): this;
    /**
     * Add the `Generated By AI` label.
     */
    addAiGenerated(): this;
    /**
     * Enable message feedback.
     * @param mode - `'default'` shows Teams' built-in thumbs up/down UI.
     *               `'custom'` triggers a `message/fetchTask` invoke so the bot can return its own task module dialog.
     */
    addFeedback(mode?: 'default' | 'custom'): this;
    /**
     * Add citations
     */
    addCitation(position: number, appearance: CitationAppearance): this;
    /**
     * is this a streaming activity
     */
    isStreaming(): boolean;
    /**
     * Get or create the base message entity.
     * There should only be one root level message entity.
     */
    private ensureSingleRootLevelMessageEntity;
}

export { Activity, type IActivity };
