<?php

namespace app\event;
/**
 * 用于检测业务代码死循环或者长时间阻塞等问题
 * 如果发现业务卡死，可以将下面declare打开（去掉//注释），并执行php start.php reload
 * 然后观察一段时间workerman.log看是否有process_timeout异常
 */
//declare(ticks=1);

/**
 * 聊天主逻辑
 * 主要是处理 onMessage onClose
 */

use \GatewayWorker\Lib\Gateway;

class AdminGatewayEvents
{
    public static function onMessage(string $client_id, string $message):void
    {
        var_dump($message);
        // 客户端传递的是json数据
        $message_data = json_decode($message, true);
        if (!$message_data) {
            return;
        }
        $message_data = array_merge([
            'type' => '',
            'event'=> '',
        ], $message_data);


        // 根据类型执行不同的业务
        switch ($message_data['type']) {
            // 客户端回应服务端的心跳
            case 'pong':
                return;
            case 'system':
                switch ($message_data['event']) {
                    // 客户端登录 message格式: {type:login, name:xx, room_id:1} ，添加到客户端，广播给所有客户端xx进入聊天室
                    case 'login':
                        // 判断是否有房间号
                        if (!isset($message_data['room_id'])) {
                            throw new \Exception("\$message_data['room_id'] not set. client_ip:{$_SERVER['REMOTE_ADDR']} \$message:$message");
                        }

                        // 把房间号昵称放到session中
                        $room_id = $message_data['room_id'];
                        $client_name = htmlspecialchars($message_data['client_name']);
                        $_SESSION['room_id'] = $room_id;
                        $_SESSION['client_name'] = $client_name;

                        // 获取房间内所有用户列表
                        $clients_list = Gateway::getClientSessionsByGroup($room_id);
                        foreach ($clients_list as $tmp_client_id => $item) {
                            $clients_list[$tmp_client_id] = $item['client_name'];
                        }
                        $clients_list[$client_id] = $client_name;

                        // 转播给当前房间的所有客户端，xx进入聊天室 message {type:login, client_id:xx, name:xx}
                        $new_message = array('type' => $message_data['type'], 'client_id' => $client_id, 'client_name' => htmlspecialchars($client_name), 'time' => date('Y-m-d H:i:s'));
                        Gateway::sendToGroup($room_id, json_encode($new_message));
                        Gateway::joinGroup($client_id, $room_id);

                        // 给当前用户发送用户列表
                        $new_message['client_list'] = $clients_list;
                        Gateway::sendToCurrentClient(json_encode($new_message));
                        return;

                    // 客户端发言 message: {type:say, to_client_id:xx, content:xx}
                    case 'say':
                        // 非法请求
                        if (!isset($_SESSION['room_id'])) {
                            throw new \Exception("\$_SESSION['room_id'] not set. client_ip:{$_SERVER['REMOTE_ADDR']}");
                        }
                        $room_id = $_SESSION['room_id'];
                        $client_name = $_SESSION['client_name'];

                        // 私聊
                        if ($message_data['to_client_id'] != 'all') {
                            $new_message = array(
                                'type' => 'say',
                                'from_client_id' => $client_id,
                                'from_client_name' => $client_name,
                                'to_client_id' => $message_data['to_client_id'],
                                'content' => "<b>对你说: </b>" . nl2br(htmlspecialchars($message_data['content'])),
                                'time' => date('Y-m-d H:i:s'),
                            );
                            Gateway::sendToClient($message_data['to_client_id'], json_encode($new_message));
                            $new_message['content'] = "<b>你对" . htmlspecialchars($message_data['to_client_name']) . "说: </b>" . nl2br(htmlspecialchars($message_data['content']));
                            Gateway::sendToCurrentClient(json_encode($new_message));
                            return;
                        }

                        $new_message = array(
                            'type' => 'say',
                            'from_client_id' => $client_id,
                            'from_client_name' => $client_name,
                            'to_client_id' => 'all',
                            'content' => nl2br(htmlspecialchars($message_data['content'])),
                            'time' => date('Y-m-d H:i:s'),
                        );
                        Gateway::sendToGroup($room_id, json_encode($new_message));
                        return;
                }
                return;
        }
    }

    public static function onClose(string $client_id)
    {
        var_dump(['client_id' => $client_id, 'r'=>'CLOSET']);
//        // 从房间的客户端列表中删除
//        if (isset($_SESSION['room_id'])) {
//            $room_id = $_SESSION['room_id'];
//            $new_message = array('type' => 'logout', 'from_client_id' => $client_id, 'from_client_name' => $_SESSION['client_name'], 'time' => date('Y-m-d H:i:s'));
//            Gateway::sendToGroup($room_id, json_encode($new_message));
//        }
    }

}
