import { MsgCall } from "tsrpc";
import { playerManager } from "../managers/PlayerManager";
import { MsgReqLogin } from "../shared/protocols/MsgReqLogin";
import { MsgResLogin, PlayerInfo } from "../shared/protocols/MsgResLogin";
import { gameToClientPosition } from "../utils/coordinate";

/**
 * 登录消息处理器
 * 处理玩家登录流程：
 * 1. 查找已有角色
 * 2. 若无角色，自动注册并创建角色
 * 3. 分配出生点
 * 4. 返回角色信息
 */
export default async function (call: MsgCall<MsgReqLogin>) {
    const { playerId, playerName } = call.msg;

    // 验证玩家ID
    if (!playerId || playerId.trim().length === 0) {
        call.conn.sendMsg('ResLogin', {
            success: false,
            message: '玩家ID不能为空'
        });
        return;
    }

    try {
        // 检查玩家是否已存在
        const isNewPlayer = !playerManager.hasPlayer(playerId);

        // 获取或创建玩家（自动处理注册和创角）
        const player = playerManager.getOrCreatePlayer(playerId, playerName);

        // 设置玩家在线状态
        playerManager.setPlayerOnline(playerId, call.conn.id);

        // 保存玩家ID到连接对象，供其他消息处理器使用
        (call.conn as any).playerId = playerId;

        // 转换为协议格式（将服务器内部坐标转换为客户端坐标）
        const playerInfo: PlayerInfo = {
            id: player.id,
            name: player.name,
            position: gameToClientPosition(player.position),
            spawnPoint: gameToClientPosition(player.spawnPoint),
            hp: player.hp,
            maxHp: player.maxHp,
            isAlive: player.isAlive,
            createdAt: player.createdAt,
            lastLoginAt: player.lastLoginAt
        };

        // 获取房间内其他在线玩家信息
        const otherOnlinePlayers = playerManager.getOnlinePlayers().filter(p => p.id !== playerId);
        const otherPlayersInfo: PlayerInfo[] = otherOnlinePlayers.map(p => ({
            id: p.id,
            name: p.name,
            position: gameToClientPosition(p.position),
            spawnPoint: gameToClientPosition(p.spawnPoint),
            hp: p.hp,
            maxHp: p.maxHp,
            isAlive: p.isAlive,
            createdAt: p.createdAt,
            lastLoginAt: p.lastLoginAt
        }));

        // 广播玩家加入消息给其他在线玩家
        const { broadcastToAll } = await import('../utils/broadcast');

        broadcastToAll('PlayerJoin', {
            playerId: player.id,
            playerName: player.name,
            position: gameToClientPosition(player.position),
            isNewPlayer,
            timestamp: Date.now()
        }, call.conn.id);

        // 返回成功结果
        const response: MsgResLogin = {
            success: true,
            message: isNewPlayer ? '创建角色成功，欢迎来到游戏世界！' : '登录成功，欢迎回来！',
            player: playerInfo,
            isNewPlayer,
            otherPlayers: otherPlayersInfo
        };

        call.conn.sendMsg('ResLogin', response);

        console.log(`玩家 ${player.name} (${playerId}) ${isNewPlayer ? '首次登录' : '登录成功'}`);
        console.log(`  在线玩家数: ${playerManager.getOnlinePlayerCount()}`);

    } catch (error) {
        console.error('登录失败:', error);
        call.conn.sendMsg('ResLogin', {
            success: false,
            message: `登录失败: ${error instanceof Error ? error.message : '未知错误'}`
        });
    }
}