<?php

namespace support\OpenImSdk\Api;

use support\OpenImSdk\Core\Url;
use support\OpenImSdk\Core\Utils;

class Group
{
    /**
     * 创建群组
     * @param string $ownerUserID 群主ID
     * @param array $memberUserIDs 普通成员ID列表
     * @param array $adminUserIDs 管理员ID列表
     * @param string $groupName 群名称
     * @param string $groupID 群ID，可选
     * @param string $faceURL 群头像
     * @param string $introduction 群简介
     * @param string $notification 群公告
     * @param string $ex 扩展字段
     * @param int $groupType 群类型，固定为2
     * @param int $needVerification 加群验证方式
     * @param int $lookMemberInfo 查看群成员信息权限
     * @param int $applyMemberFriend 群内加好友权限
     * @return array
     */
    public function createGroup(string $ownerUserID, array $memberUserIDs = [], array $adminUserIDs = [], string $groupName = '', 
                                string $groupID = '', string $faceURL = '', string $introduction = '', string $notification = '', 
                                string $ex = '', int $groupType = 2, int $needVerification = 0, int $lookMemberInfo = 0, int $applyMemberFriend = 0): array
    {
        // 获取管理员token
        $adminToken = Utils::getAdminToken();
        $data = [
            'ownerUserID' => $ownerUserID,
            'memberUserIDs' => $memberUserIDs,
            'adminUserIDs' => $adminUserIDs,
            'groupInfo' => [
                'groupID' => $groupID,
                'groupName' => $groupName,
                'notification' => $notification,
                'introduction' => $introduction,
                'faceURL' => $faceURL,
                'ex' => $ex,
                'groupType' => $groupType,
                'needVerification' => $needVerification,
                'lookMemberInfo' => $lookMemberInfo,
                'applyMemberFriend' => $applyMemberFriend
            ]
        ];
        return Utils::send(Url::$createGroup, $data, '创建群组失败', $adminToken);
    }

    /**
     * 申请加入群组
     * @param string $token 用户token
     * @param string $groupID 群组ID
     * @param string $reqMsg 申请消息
     * @param int $joinSource 加入来源
     * @return array
     */
    public function joinGroup(string $token, string $groupID, string $reqMsg = '', int $joinSource = 0): array
    {
        $data = [
            'groupID' => $groupID,
            'reqMsg' => $reqMsg,
            'joinSource' => $joinSource
        ];
        return Utils::send(Url::$joinGroup, $data, '申请加入群组失败', $token);
    }

    /**
     * 退出群组
     * @param string $token 用户token
     * @param string $groupID 群组ID
     * @return array
     */
    public function quitGroup(string $token, string $groupID): array
    {
        return Utils::send(Url::$quitGroup, ['groupID' => $groupID], '退出群组失败', $token);
    }

    /**
     * 获取群组信息
     * @param array $groupIDs 群组ID列表
     * @return array
     */
    public function getGroupsInfo(array $groupIDs): array
    {
        // 获取管理员token
        $adminToken = Utils::getAdminToken();
        return Utils::send(Url::$getGroupsInfo, ['groupIDs' => $groupIDs], '获取群组信息失败', $adminToken);
    }

    /**
     * 获取群成员列表
     * @param string $groupID 群组ID
     * @param int $filter 过滤类型，0所有，1群主，2管理员，3普通成员，4禁言，5进入黑名单
     * @param int $offset 偏移量
     * @param int $count 数量
     * @return array
     */
    public function getGroupMemberList(string $groupID, int $filter = 0, int $offset = 0, int $count = 100): array
    {
        // 获取管理员token
        $adminToken = Utils::getAdminToken();
        $data = [
            'groupID' => $groupID,
            'filter' => $filter,
            'offset' => $offset,
            'count' => $count
        ];
        return Utils::send(Url::$getGroupMemberList, $data, '获取群成员列表失败', $adminToken);
    }

    /**
     * 获取指定群成员信息
     * @param string $groupID 群组ID
     * @param array $userIDs 用户ID列表
     * @return array
     */
    public function getGroupMembersInfo(string $groupID, array $userIDs): array
    {
        // 获取管理员token
        $adminToken = Utils::getAdminToken();
        $data = [
            'groupID' => $groupID,
            'userIDs' => $userIDs
        ];
        return Utils::send(Url::$getGroupMembersInfo, $data, '获取指定群成员信息失败', $adminToken);
    }

    /**
     * 将用户拉入群组
     * @param string $groupID 群组ID
     * @param string $inviterUserID 邀请者ID
     * @param array $invitedUserIDList 被邀请的用户ID列表
     * @param string $reason 邀请原因
     * @return array
     */
    public function inviteUserToGroup(string $groupID, string $inviterUserID, array $invitedUserIDList, string $reason = ''): array
    {
        // 获取管理员token
        $adminToken = Utils::getAdminToken();
        $data = [
            'groupID' => $groupID,
            'inviterUserID' => $inviterUserID,
            'invitedUserIDList' => $invitedUserIDList,
            'reason' => $reason,
        ];
        return Utils::send(Url::$inviteUserToGroup, $data, '将用户拉入群组失败', $adminToken);
    }

    /**
     * 踢出群成员
     * @param string $groupID 群组ID
     * @param string $kickUserID 踢出者ID
     * @param array $kickedUserIDs 被踢出的用户ID列表
     * @param string $reason 踢出原因
     * @return array
     */
    public function kickGroupMember(string $groupID, string $kickUserID, array $kickedUserIDs, string $reason = ''): array
    {
        // 获取管理员token
        $adminToken = Utils::getAdminToken();
        $data = [
            'groupID' => $groupID,
            'kickUserID' => $kickUserID,
            'kickedUserIDs' => $kickedUserIDs,
            'reason' => $reason
        ];
        return Utils::send(Url::$kickGroupMember, $data, '踢出群成员失败', $adminToken);
    }

    /**
     * 转让群主
     * @param string $groupID 群组ID
     * @param string $oldOwnerUserID 原群主ID
     * @param string $newOwnerUserID 新群主ID
     * @return array
     */
    public function transferGroupOwner(string $groupID, string $oldOwnerUserID, string $newOwnerUserID): array
    {
        // 获取管理员token
        $adminToken = Utils::getAdminToken();
        $data = [
            'groupID' => $groupID,
            'oldOwnerUserID' => $oldOwnerUserID,
            'newOwnerUserID' => $newOwnerUserID
        ];
        return Utils::send(Url::$transferGroupOwner, $data, '转让群主失败', $adminToken);
    }

    /**
     * 获取用户加入的群组列表
     * @param string $userID 用户ID
     * @return array
     */
    public function getJoinedGroupList(string $userID): array
    {
        // 获取管理员token
        $adminToken = Utils::getAdminToken();
        return Utils::send(Url::$getJoinedGroupList, ['userID' => $userID], '获取用户加入的群组列表失败', $adminToken);
    }

    /**
     * 解散群组
     * @param string $groupID 群组ID
     * @return array
     */
    public function dismissGroup(string $groupID): array
    {
        // 获取管理员token
        $adminToken = Utils::getAdminToken();
        return Utils::send(Url::$dismissGroup, ['groupID' => $groupID], '解散群组失败', $adminToken);
    }

    /**
     * 设置群成员昵称
     * @param string $groupID 群组ID
     * @param string $userID 用户ID
     * @param string $nickname 群内昵称
     * @return array
     */
    public function setGroupMemberNickname(string $groupID, string $userID, string $nickname): array
    {
        // 获取管理员token
        $adminToken = Utils::getAdminToken();
        $data = [
            'groupID' => $groupID,
            'userID' => $userID,
            'nickname' => $nickname
        ];
        return Utils::send(Url::$setGroupMemberNickname, $data, '设置群成员昵称失败', $adminToken);
    }

    /**
     * 设置群成员信息
     * @param string $groupID 群组ID
     * @param string $userID 用户ID
     * @param array $data 群成员信息
     * @return array
     */
    public function setGroupMemberInfo(string $groupID, string $userID, array $data): array
    {
        // 获取管理员token
        $adminToken = Utils::getAdminToken();
        $data = array_merge([
            'groupID' => $groupID,
            'userID' => $userID
        ], $data);
        return Utils::send(Url::$setGroupMemberInfo, $data, '设置群成员信息失败', $adminToken);
    }

    /**
     * 获取群成员用户ID列表
     * @param string $groupID 群组ID
     * @return array
     */
    public function getGroupMemberUserIDs(string $groupID): array
    {
        // 获取管理员token
        $adminToken = Utils::getAdminToken();
        return Utils::send(Url::$getGroupMemberUserIDs, ['groupID' => $groupID], '获取群成员用户ID列表失败', $adminToken);
    }

    /**
     * 获取群成员列表
     * @param string $groupID 群组ID
     * @param int $offset 偏移量
     * @param int $count 数量
     * @return array
     */
    public function getGroupAllMemberList(string $groupID, int $offset = 0, int $count = 100): array
    {
        // 获取管理员token
        $adminToken = Utils::getAdminToken();
        $data = [
            'groupID' => $groupID,
            'pagination' => [
                'pageNumber' => intval($offset / $count) + 1,
                'showNumber' => $count
            ]
        ];
        return Utils::send(Url::$getGroupAllMemberList, $data, '获取群成员列表失败', $adminToken);
    }

    /**
     * 获取用户加群申请列表
     * @param string $userID 用户ID
     * @return array
     */
    public function getUserReqGroupApplicationList(string $userID): array
    {
        // 获取管理员token
        $adminToken = Utils::getAdminToken();
        return Utils::send(Url::$getUserReqGroupApplicationList, ['userID' => $userID], '获取用户加群申请列表失败', $adminToken);
    }
    
    /**
     * 获取指定用户对指定群组的加群请求
     * @param string $groupID 群组ID
     * @param array $userIDs 用户ID列表
     * @return array
     */
    public function getGroupApplicationListByUserID(string $groupID, array $userIDs): array
    {
        // 获取管理员token
        $adminToken = Utils::getAdminToken();
        $data = [
            'groupID' => $groupID,
            'userIDs' => $userIDs
        ];
        return Utils::send(Url::$getGroupUsersReqApplicationList, $data, '获取指定用户对指定群组的加群请求失败', $adminToken);
    }

    /**
     * 处理群组申请
     * @param string $groupID 群组ID
     * @param string $fromUserID 申请者ID
     * @param string $handledUserID 处理者ID
     * @param int $handleResult 处理结果，1同意，2拒绝
     * @param string $handleMsg 处理消息
     * @return array
     */
    public function groupApplicationResponse(string $groupID, string $fromUserID, string $handledUserID, int $handleResult, string $handleMsg = ''): array
    {
        // 获取管理员token
        $adminToken = Utils::getAdminToken();
        $data = [
            'groupID' => $groupID,
            'fromUserID' => $fromUserID,
            'handledUserID' => $handledUserID,
            'handleResult' => $handleResult,
            'handleMsg' => $handleMsg
        ];
        return Utils::send(Url::$groupApplicationResponse, $data, '处理群组申请失败', $adminToken);
    }

    /**
     * 禁言群组，只有群主和管理员可以发送消息
     * @param string $groupID 群组ID
     * @return array
     */
    public function muteGroup(string $groupID): array
    {
        // 获取管理员token
        $adminToken = Utils::getAdminToken();
        return Utils::send(Url::$muteGroup, ['groupID' => $groupID], '禁言群组失败', $adminToken);
    }

    /**
     * 取消禁言群组，所有成员都可以发送消息
     * @param string $groupID 群组ID
     * @return array
     */
    public function cancelMuteGroup(string $groupID): array
    {
        // 获取管理员token
        $adminToken = Utils::getAdminToken();
        return Utils::send(Url::$cancelMuteGroup, ['groupID' => $groupID], '取消禁言群组失败', $adminToken);
    }

    /**
     * 禁言群成员
     * @param string $groupID 群组ID
     * @param string $userID 群成员ID
     * @param int $mutedSeconds 禁言时间（秒）
     * @return array
     */
    public function muteGroupMember(string $groupID, string $userID, int $mutedSeconds = 0): array
    {
        // 获取管理员token
        $adminToken = Utils::getAdminToken();
        $data = ['groupID' => $groupID, 'userID' => $userID, 'mutedSeconds' => $mutedSeconds];
        return Utils::send(Url::$muteGroupMember, $data, '禁言群成员失败', $adminToken);
    }

    /**
     * 取消禁言群成员
     * @param string $groupID 群组ID
     * @param string $userID 群成员ID
     * @return array
     */
    public function cancelMuteGroupMember(string $groupID, string $userID): array
    {
        // 获取管理员token
        $adminToken = Utils::getAdminToken();
        $data = ['groupID' => $groupID, 'userID' => $userID];
        return Utils::send(Url::$cancelMuteGroupMember, $data, '取消禁言群成员失败', $adminToken);
    }
}
