<?php

namespace support\OpenImSdk\Api;

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

class User
{
    /**
     * 获取用户列表
     * @param int $pagination 页码
     * @param int $showNumber 每页数量
     * @return array
     */
    public function getUsers(int $pagination = 1, int $showNumber = 20): array
    {
        // 获取管理员token
        $adminToken = Utils::getAdminToken();
        $data = [
            'pagination' => [
                'pageNumber' => $pagination,
                'showNumber' => $showNumber
            ]
        ];
        return Utils::send(Url::$getUsers, $data, '获取用户列表错误', $adminToken);
    }

    /**
     * 获取用户在线状态
     * @param array $userIDList 用户ID列表
     * @return array
     */
    public function getUsersOnlineStatus(array $userIDList): array
    {
        // 获取管理员token
        $adminToken = Utils::getAdminToken();
        return Utils::send(Url::$getUsersOnlineStatus, ['userIDList' => $userIDList], '获取用户在线状态错误', $adminToken);
    }

    /**
     * 获取用户在线token详情
     * @param array $userIDList 用户ID列表
     * @return array
     */
    public function getUsersOnlineTokenDetail(array $userIDList): array
    {
        // 获取管理员token
        $adminToken = Utils::getAdminToken();
        return Utils::send(Url::$getUsersOnlineTokenDetail, ['userIDList' => $userIDList], '获取用户在线token详情错误', $adminToken);
    }

    /**
     * 获取订阅用户状态
     * @return array
     */
    public function getSubscribeUsersStatus(): array
    {
        // 获取管理员token
        $adminToken = Utils::getAdminToken();
        return Utils::send(Url::$getSubscribeUsersStatus, [], '获取订阅用户状态错误', $adminToken);
    }

    /**
     * 订阅用户状态
     * @param string $token 管理员token
     * @param array $userIDList 用户ID列表
     * @return array
     */
    public function subscribeUsersStatus(array $userIDList): array
    {
        // 获取管理员token
        $adminToken = Utils::getAdminToken();
        return Utils::send(Url::$subscribeUsersStatus, ['userIDList' => $userIDList], '订阅用户状态错误', $adminToken);
    }

    /**
     * 设置全局免打扰
     * @param int $globalRecvMsgOpt 全局消息接收选项
     * @return array
     */
    public function setGlobalMsgRecvOpt(int $globalRecvMsgOpt): array
    {
        // 获取管理员token
        $adminToken = Utils::getAdminToken();
        return Utils::send(Url::$setGlobalMsgRecvOpt, ['globalRecvMsgOpt' => $globalRecvMsgOpt], '设置全局免打扰错误', $adminToken);
    }

    /**
     * 修改用户信息
     * @param string $userID 用户ID
     * @param array $data 用户信息
     * @return array
     */
    public function updateUserInfo(string $userID, array $data): array|bool
    {
        // 获取管理员token
        $adminToken = Utils::getAdminToken();
        $data = array_merge(['userID' => $userID], $data);
        $data = [
            'userInfo'  =>  $data
        ];
        return Utils::send(Url::$updateUserInfo, $data, '修改用户信息错误', $adminToken);
    }

    /**
     * 搜索通知账号
     * @param string $keyword 搜索关键词
     * @param int $pagination 页码
     * @param int $showNumber 每页数量
     * @return array
     */
    public function searchNotificationAccount(string $keyword, int $pagination = 1, int $showNumber = 20): array
    {
        // 获取管理员token
        $adminToken = Utils::getAdminToken();
        $data = [
            'keyword' => $keyword,
            'pagination' => [
                'pageNumber' => $pagination,
                'showNumber' => $showNumber
            ]
        ];
        return Utils::send(Url::$searchNotificationAccount, $data, '搜索通知账号错误', $adminToken);
    }

    /**
     * 添加通知账号
     * @param string $userID 用户ID
     * @param string $nickname 昵称
     * @param string $faceURL 头像
     * @param int $gender 性别
     * @param string $phoneNumber 手机号
     * @param string $birth 生日
     * @param string $email 邮箱
     * @param string $ex 扩展字段
     * @return array
     */
    public function addNotificationAccount(string $userID, string $nickname = '', string $faceURL = '', int $gender = 1, string $phoneNumber = '', string $birth = '', string $email = '', string $ex = ''): array
    {
        // 获取管理员token
        $adminToken = Utils::getAdminToken();
        $data = [
            'userID' => $userID,
            'nickname' => $nickname,
            'faceURL' => $faceURL,
            'gender' => $gender,
            'phoneNumber' => $phoneNumber,
            'birth' => $birth,
            'email' => $email,
            'ex' => $ex
        ];
        return Utils::send(Url::$addNotificationAccount, $data, '添加通知账号错误');
    }

    /**
     * 更新通知账号
     * @param string $userID 用户ID
     * @param string $nickname 昵称
     * @param string $faceURL 头像
     * @param int $gender 性别
     * @param string $phoneNumber 手机号
     * @param string $birth 生日
     * @param string $email 邮箱
     * @param string $ex 扩展字段
     * @return array
     */
    public function updateNotificationAccount(string $userID, string $nickname = '', string $faceURL = '', int $gender = 1, string $phoneNumber = '', string $birth = '', string $email = '', string $ex = ''): array
    {
        // 获取管理员token
        $adminToken = Utils::getAdminToken();
        $data = [
            'userID' => $userID,
            'nickname' => $nickname,
            'faceURL' => $faceURL,
            'gender' => $gender,
            'phoneNumber' => $phoneNumber,
            'birth' => $birth,
            'email' => $email,
            'ex' => $ex
        ];
        return Utils::send(Url::$updateNotificationAccount, $data, '更新通知账号错误', $adminToken);
    }

    /**
     * 检查列表账户注册状态
     * @param array $checkUserIDList 用户ID列表
     * @return array
     */
    public function accountCheck(array $checkUserIDList): array
    {
        // 获取管理员token
        $adminToken = Utils::getAdminToken();
        return Utils::send(Url::$accountCheck, ['checkUserIDList' => $checkUserIDList], '检查列表账户注册状态错误', $adminToken);
    }

    /**
     * 获取所有用户uid列表
     * @return array
     */
    public function getAllUsersUid($page=1,$limit=100): array
    {
        // 获取管理员token
        $adminToken = Utils::getAdminToken();
        return Utils::send(Url::$getAllUsersUid, ['pagination'=>['pageNumber'=>$page,"showNumber"=>$limit]], '获取所有用户uid列表错误', $adminToken);
    }

    /**
     * 获取自己的信息
     * @param string $userID 用户ID
     * @return array
     */
    public function getSelfUserInfo(string $userID): array
    {
        // 获取管理员token
        $userToken = Utils::getUserToken($userID);
        return Utils::send(Url::$getSelfUserInfo, ['userID' => $userID], '获取自己的信息错误', $userToken);
    }

    /**
     * 获取用户信息
     * @param array $userIDList 用户ID列表
     * @return array
     */
    public function getUsersInfo(array $userIDList): array
    {
        // 获取管理员token
        $adminToken = Utils::getAdminToken();
        return Utils::send(Url::$getUsersInfo, ['userIDList' => $userIDList], '获取用户信息错误', $adminToken);
    }

    //Header
    //
    //Header Name	Example Value	Required	Type	Description
    //operationID	1646445464564	Required	string	Used for global traceability, suggested as a unique timestamp per request
    //token	eyJhbxxxx3Xs	Required	string	Admin token

    //Field Name	Required	Type	Description
    //users	Required	array	List of users
    //users.userID	Required	string	User ID
    //users.nickname	Required	string	User nickname
    //users.faceURL	Required	string	User avatar URL
    /**
     * 用户注册
     * @param string $userID 用户ID
     * @param string $nickname 昵称
     * @param string $faceURL 头像地址
     * @return array
     */
    public function userRegister(string $userID, string $nickname = '', string $faceURL = ''): array|bool
    {
        // 获取管理员token
        $adminToken = Utils::getAdminToken();
        $data = [
            'users' => [
                [
                    'userID' => $userID,
                    'nickname' => $nickname,
                    'faceURL' => $faceURL
                ]
            ]
        ];
        return Utils::send(Url::$userRegister, $data, '注册IM错误', $adminToken);
    }
}
