import { ApiCall } from "tsrpc";
import { ReqLogin, ResLogin, PlayerInfo } from "../shared/protocols/PtlLogin";
import { playerManager } from "../managers/PlayerManager";

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

    // 验证玩家ID
    if (!playerId || playerId.trim().length === 0) {
        call.error('玩家ID不能为空');
        return;
    }

    try {
        // 检查玩家是否已存在
        const isNewPlayer = !playerManager.hasPlayer(playerId);
        
        // 获取或创建玩家（自动处理注册和创角）
        const player = playerManager.getOrCreatePlayer(playerId, playerName);
        
        // 设置玩家在线状态
        playerManager.setPlayerOnline(playerId, call.conn.id);
        
        // 保存玩家ID到连接对象，供其他API使用
        (call.conn as any).playerId = playerId;
        
        // 转换为协议格式
        const playerInfo: PlayerInfo = {
            id: player.id,
            name: player.name,
            position: { ...player.position },
            spawnPoint: { ...player.spawnPoint },
            hp: player.hp,
            maxHp: player.maxHp,
            isAlive: player.isAlive,
            createdAt: player.createdAt,
            lastLoginAt: player.lastLoginAt
        };
        
        // 广播玩家加入消息给其他在线玩家
        const { broadcastToAll } = await import('../utils/broadcast');
        
        broadcastToAll('PlayerJoin', {
            playerId: player.id,
            playerName: player.name,
            position: { ...player.position },
            isNewPlayer,
            timestamp: Date.now()
        }, call.conn.id);
        
        // 返回成功结果
        call.succ({
            success: true,
            message: isNewPlayer ? '创建角色成功，欢迎来到游戏世界！' : '登录成功，欢迎回来！',
            player: playerInfo,
            isNewPlayer
        });

        console.log(`玩家 ${player.name} (${playerId}) ${isNewPlayer ? '首次登录' : '登录成功'}`);
        console.log(`  在线玩家数: ${playerManager.getOnlinePlayerCount()}`);
        
    } catch (error) {
        console.error('登录失败:', error);
        call.error(`登录失败: ${error instanceof Error ? error.message : '未知错误'}`);
    }
}
