import { ApiCall } from "tsrpc";
import { ReqMove, ResMove } from "../shared/protocols/PtlMove";
import { playerManager } from "../managers/PlayerManager";
import { broadcastToAll } from "../utils/broadcast";
import { MsgPlayerMove } from "../shared/protocols/MsgPlayerMove";

/**
 * 移动API
 * 处理玩家移动请求，验证位置合法性，更新玩家位置并广播给其他玩家
 */
export default async function (call: ApiCall<ReqMove, ResMove>) {
    const { x, y } = call.req;
    
    // 从连接中获取玩家ID（需要在登录时保存）
    const playerId = (call.conn as any).playerId;
    
    if (!playerId) {
        call.error('未登录，请先登录');
        return;
    }
    
    // 获取玩家信息
    const player = playerManager.getPlayer(playerId);
    
    if (!player) {
        call.error('玩家不存在');
        return;
    }
    
    // 检查玩家是否存活
    if (!player.isAlive) {
        call.error('玩家已死亡，无法移动');
        return;
    }
    
    // 验证坐标是否为数字
    if (typeof x !== 'number' || typeof y !== 'number') {
        call.error('坐标格式错误');
        return;
    }
    
    // 验证坐标是否为整数
    if (!Number.isInteger(x) || !Number.isInteger(y)) {
        call.error('坐标必须为整数');
        return;
    }
    
    try {
        // 尝试更新玩家位置
        const success = playerManager.updatePlayerPosition(playerId, x, y);
        
        if (!success) {
            call.succ({
                success: false,
                message: '移动失败，位置无效或超出世界边界'
            });
            return;
        }
        
        // 获取更新后的位置
        const newPosition = { x, y };
        
        // 广播移动消息给所有其他玩家
        const moveMsg: MsgPlayerMove = {
            playerId: player.id,
            playerName: player.name,
            position: newPosition,
            timestamp: Date.now()
        };
        
        broadcastToAll('MsgPlayerMove', moveMsg, call.conn.id);
        
        // 返回成功结果
        call.succ({
            success: true,
            message: '移动成功',
            position: newPosition
        });
        
        console.log(`玩家 ${player.name} 移动到 (${x}, ${y})`);
        
    } catch (error) {
        console.error('移动失败:', error);
        call.error(`移动失败: ${error instanceof Error ? error.message : '未知错误'}`);
    }
}
