import { ZaloClient } from "../clients/zalo-client";
import { GroupCreateRequest, GroupCreateResult, GroupCreateData, GroupUpdateRequest, GroupUpdateResult, GroupAssetUpdateRequest, GroupAvatarUpdateRequest, GroupMemberInviteRequest, GroupInviteResult, RecentChatsResponse, GroupConversationResponse, GroupsOfOAResponse, GroupDetailResponse, GroupPendingMembersResponse, GroupAcceptPendingMembersResponse, GroupRemoveMembersResponse, GroupMembersResponse, GroupQuotaMessageResponse } from "../types/group";
import { GMFProductType, QuotaType } from "../types/oa";
/**
 * Service for handling Zalo Official Account Group Management Framework (GMF) APIs
 *
 * CONDITIONS FOR USING ZALO GMF GROUP MANAGEMENT:
 *
 * 1. GENERAL CONDITIONS:
 *    - OA must be granted permission to use GMF (Group Message Framework) feature
 *    - Access token must have "manage_group" and "group_message" scopes
 *    - OA must have active status and be verified
 *    - Must comply with limits on number of groups and members
 *
 * 2. CREATE NEW GROUP:
 *    - Group name: required, max 100 characters, no special characters
 *    - Description: optional, max 500 characters
 *    - Avatar: optional, JPG/PNG format, max 5MB
 *    - Initial members: max 200 people, must be users who have interacted with OA
 *    - OA automatically becomes admin of the group
 *
 * 3. MEMBER MANAGEMENT:
 *    - Only admins can invite/remove members
 *    - Invite members: max 50 people per time, users must have interacted with OA
 *    - Remove members: cannot remove other admins, must have at least 1 admin
 *    - Members can leave group themselves
 *
 * 4. ADMIN MANAGEMENT:
 *    - Only current admins can add/remove other admins
 *    - Must have at least 1 admin in group
 *    - OA always has admin rights and cannot be removed
 *
 * 5. LIMITS AND CONSTRAINTS:
 *    - Maximum groups: according to service package (usually 10-100 groups)
 *    - Maximum members per group: 200 people
 *    - Group creation frequency: max 10 groups/day
 *    - Member invitation frequency: max 500 invitations/day
 */
export declare class GroupManagementService {
    private readonly client;
    private readonly endpoints;
    constructor(client: ZaloClient);
    /**
     * Create new group chat with asset_id
     * @param accessToken OA access token
     * @param groupData Group information to create
     * @returns Created group information
     *
     * API: POST https://openapi.zalo.me/v3.0/oa/group/creategroupwithoa
     */
    createGroup(accessToken: string, groupData: GroupCreateRequest): Promise<GroupCreateResult>;
    /**
     * Helper method to extract group data from create response
     * @param response Full API response
     * @returns Group data only
     */
    extractGroupData(response: GroupCreateResult): GroupCreateData;
    /**
     * Helper method to extract group info from update response
     * @param response Full API response
     * @returns Group info only
     */
    extractGroupInfo(response: GroupUpdateResult): {
        group_id: string;
        group_link: string;
        name: string;
        group_description: string;
        avatar: string;
        status: "enabled" | "disabled";
        total_member: number;
        max_member: string;
        auto_delete_date: string;
    };
    /**
     * Helper method to extract group settings from update response
     * @param response Full API response
     * @returns Group settings only
     */
    extractGroupSettings(response: GroupUpdateResult): {
        lock_send_msg: boolean;
        join_appr: boolean;
        enable_msg_history: boolean;
        enable_link_join: boolean;
    };
    /**
     * Helper method to extract asset info from update response
     * @param response Full API response
     * @returns Asset info only
     */
    extractAssetInfo(response: GroupUpdateResult): {
        asset_type: "gmf10" | "gmf50" | "gmf100";
        asset_id: string;
        valid_through: string;
        auto_renew: string;
    };
    /**
     * Update group asset (upgrade package or extend expiration)
     * @param accessToken OA access token
     * @param groupId Group ID
     * @param assetId New asset ID for the group
     * @returns Update result with full group information
     *
     * API: POST https://openapi.zalo.me/v3.0/oa/group/updateasset
     *
     * Use cases:
     * - Increase member limit for the group
     * - Extend group expiration when expired
     */
    updateGroupAsset(accessToken: string, groupId: string, assetId: string): Promise<GroupUpdateResult>;
    /**
     * Update group asset (upgrade package or extend expiration) - Object parameter version
     * @param accessToken OA access token
     * @param updateData Asset update data
     * @returns Update result with full group information
     *
     * API: POST https://openapi.zalo.me/v3.0/oa/group/updateasset
     */
    updateGroupAsset(accessToken: string, updateData: GroupAssetUpdateRequest): Promise<GroupUpdateResult>;
    /**
     * Get detailed group information
     * @param accessToken OA access token
     * @param groupId Group ID
     * @returns Detailed group information including group_info, asset_info and group_setting
     *
     * API: GET https://openapi.zalo.me/v3.0/oa/group/getgroup
     */
    getGroupInfo(accessToken: string, groupId: string): Promise<GroupDetailResponse>;
    /**
     * Update group information
     * @param accessToken OA access token
     * @param groupId Group ID
     * @param updateData Information to update
     * @returns Update result with full group information
     *
     * API: POST https://openapi.zalo.me/v3.0/oa/group/updateinfo
     */
    updateGroupInfo(accessToken: string, groupId: string, updateData: GroupUpdateRequest): Promise<GroupUpdateResult>;
    /**
     * Update group avatar
     * @param accessToken OA access token
     * @param groupId Group ID
     * @param avatarData New avatar information
     * @returns Update result
     * @deprecated Use updateGroupInfo() with group_avatar field instead
     */
    updateGroupAvatar(accessToken: string, groupId: string, avatarData: GroupAvatarUpdateRequest): Promise<{
        success: boolean;
    }>;
    /**
     * Invite members to group
     * @param accessToken OA access token
     * @param groupId Group ID
     * @param inviteData List of user IDs to invite
     * @returns Invitation result
     *
     * API: POST https://openapi.zalo.me/v3.0/oa/group/invite
     */
    inviteMembers(accessToken: string, groupId: string, inviteData: GroupMemberInviteRequest): Promise<GroupInviteResult>;
    /**
     * Invite members to group - Array parameter version
     * @param accessToken OA access token
     * @param groupId Group ID
     * @param memberUserIds Array of user IDs to invite
     * @returns Invitation result
     *
     * API: POST https://openapi.zalo.me/v3.0/oa/group/invite
     */
    inviteMembers(accessToken: string, groupId: string, memberUserIds: string[]): Promise<GroupInviteResult>;
    /**
     * Get list of pending members
     * @param accessToken OA access token
     * @param groupId Group ID
     * @param offset Offset for pagination (default: 0)
     * @param count Maximum number to return (default: 20, max: 50)
     * @returns List of pending members
     */
    getPendingMembers(accessToken: string, groupId: string, offset?: number, count?: number): Promise<GroupPendingMembersResponse>;
    /**
     * Accept pending members to group
     * @param accessToken OA access token
     * @param groupId Group ID
     * @param memberUserIds List of user IDs to accept
     * @returns Accept result
     */
    acceptPendingMembers(accessToken: string, groupId: string, memberUserIds: string[]): Promise<GroupAcceptPendingMembersResponse>;
    /**
     * Reject pending members from group
     * @param accessToken OA access token
     * @param groupId Group ID
     * @param memberUserIds List of user IDs to reject
     * @returns Reject result
     */
    rejectPendingMembers(accessToken: string, groupId: string, memberUserIds: string[]): Promise<GroupAcceptPendingMembersResponse>;
    /**
     * Remove members from group
     * @param accessToken OA access token
     * @param groupId Group ID
     * @param memberUserIds List of user IDs to remove
     * @returns Remove result
     */
    removeMembers(accessToken: string, groupId: string, memberUserIds: string[]): Promise<GroupRemoveMembersResponse>;
    /**
     * Add admin rights to members - Array parameter version
     * @param accessToken OA access token
     * @param groupId Group ID
     * @param memberUserIds Array of user IDs to add admin rights
     * @returns Add admin result
     *
     * API: POST https://openapi.zalo.me/v3.0/oa/group/addadmins
     */
    addAdmins(accessToken: string, groupId: string, memberUserIds: string[]): Promise<{
        error: number;
        message: string;
    }>;
    /**
     * Remove admin rights from members - Array parameter version
     * @param accessToken OA access token
     * @param groupId Group ID
     * @param memberUserIds Array of user IDs to remove admin rights
     * @returns Remove admin result
     *
     * API: POST https://openapi.zalo.me/v3.0/oa/group/removeadmins
     */
    removeAdmins(accessToken: string, groupId: string, memberUserIds: string[]): Promise<{
        error: number;
        message: string;
    }>;
    /**
     * Delete group chat (Disband group)
     * @param accessToken OA access token
     * @param groupId Group ID to delete
     * @returns Delete result
     */
    deleteGroup(accessToken: string, groupId: string): Promise<{
        error: number;
        message: string;
    }>;
    /**
     * Get list of OA groups
     * @param accessToken OA access token
     * @param offset Offset for pagination (default: 0)
     * @param count Maximum number to return (default: 5, max: 50)
     * @returns List of OA groups
     *
     * API: GET https://openapi.zalo.me/v3.0/oa/group/getgroupsofoa
     */
    getGroupsOfOA(accessToken: string, offset?: number, count?: number): Promise<GroupsOfOAResponse>;
    /**
     * Get group quota information and asset_id
     * @param accessToken OA access token
     * @param productType Product type (optional)
     * @param quotaType Quota type (optional)
     * @returns Group quota information including asset_id
     *
     * API: POST https://openapi.zalo.me/v3.0/oa/quota/group
     */
    getGroupQuota(accessToken: string, productType?: GMFProductType, quotaType?: QuotaType): Promise<GroupQuotaMessageResponse>;
    /**
     * Get asset_id for creating GMF group
     * @param accessToken OA access token
     * @returns Asset_id for group creation
     */
    getAssetId(accessToken: string): Promise<string>;
    /**
     * Get list of asset_ids available for creating GMF groups
     * @param accessToken OA access token
     * @returns List of asset_ids and quota information
     */
    getAssetIds(accessToken: string): Promise<GroupQuotaMessageResponse>;
    /**
     * Get list of recent chats
     * @param accessToken OA access token
     * @param offset Offset for pagination (default: 0)
     * @param count Maximum number to return (default: 5, max: 50)
     * @returns List of recent chats
     *
     * API: GET https://openapi.zalo.me/v3.0/oa/group/listrecentchat
     */
    getRecentChats(accessToken: string, offset?: number, count?: number): Promise<RecentChatsResponse>;
    /**
     * Get group conversation history
     * @param accessToken OA access token
     * @param groupId Group ID
     * @param offset Offset for pagination (default: 0)
     * @param count Maximum number of messages to return (default: 5, max: 100)
     * @returns Group conversation history
     *
     * API: GET https://openapi.zalo.me/v3.0/oa/group/conversation
     */
    getGroupConversation(accessToken: string, groupId: string, offset?: number, count?: number): Promise<GroupConversationResponse>;
    /**
     * Get group members list from Zalo API
     * @param accessToken OA access token
     * @param groupId Group ID
     * @param offset Offset for pagination (default: 0)
     * @param count Maximum number to return (default: 5, max: 50)
     * @returns Group members list
     */
    getGroupMembers(accessToken: string, groupId: string, offset?: number, count?: number): Promise<GroupMembersResponse>;
    private handleGroupManagementError;
}
//# sourceMappingURL=group-management.service.d.ts.map