const {v4: uuidv4} = require('uuid');
const matchmakingHandlers = require('./handlers/matchmaking');
const roomEventHandlers = require('./handlers/roomEvents');
const gameEventHandlers = require('./handlers/gameEvents');
const { logger } = require('../utils/logger');

// 전역 상태 객체 (모든 핸들러에서 공유)
const gameState = {
    rooms: [], // {roomId, hostId, rating} 형태로 저장
    socketRooms: new Map(), // 소켓ID와 방ID 매핑
    playerRating: new Map(), // 소켓ID와 플레이어 급수 매핑
    nickname: new Map(), // 플레이어 닉네임
    imageIndex: new Map(), // 플레이어 프로필 이미지 인덱스
    matchingTimeouts: new Map(), // 매치메이킹 타임아웃
};

module.exports = function(server) {
    const io = require('socket.io')(server, {
        transports: ['websocket']
    });

    io.on('connection', function(socket) {
        console.log('Connected: ' + socket.id);

        // 매칭 관련 이벤트 핸들러 등록
        matchmakingHandlers(io, socket, gameState)

        // 방 관련 이벤트 핸들러 등록
        roomEventHandlers(io, socket, gameState);

        // 게임 내 이벤트 핸들러 등록
        gameEventHandlers(io, socket, gameState);


        // 연결 해제 시 정리
        socket.on('disconnect', function(reason) {
            logger.info('Disconnected: ' + socket.id + ', Reason: ' + reason);

            // 타임아웃이 있으면 제거
            if (gameState.matchingTimeouts.has(socket.id)) {
                clearTimeout(gameState.matchingTimeouts.get(socket.id));
                gameState.matchingTimeouts.delete(socket.id);
            }

            // 해당 소켓이 속한 방 찾기
            const roomId = gameState.socketRooms.get(socket.id);

            if (roomId) {
                // 상대방에게 연결 끊김 알림
                socket.to(roomId).emit('opponentDisconnected', {
                    message: "상대방의 연결이 끊어졌습니다."
                });

                // 대기방 목록에서 제거
                gameState.rooms = gameState.rooms.filter(room => room.roomId !== roomId);

                gameState.socketRooms.delete(socket.id);
            }

            // 플레이어 매칭 정보 제거
            gameState.playerRating.delete(socket.id);
            gameState.nickname.delete(socket.id);
            gameState.imageIndex.delete(socket.id);
        });
    });
};