// WebSocketService.tsx
import { io, Socket } from 'socket.io-client';
import apiService from './ApiService';

// Must (manually) sync these types to server/socket/socket.js

export type AnswerSubmissionToBackendType = {
    roomName: string;
    username: string;
    answer: string | number | boolean;
    idQuestion: number;
};

export type AnswerReceptionFromBackendType = {
    idUser: string;
    username: string;
    answer: string | number | boolean;
    idQuestion: number;
};

class WebSocketService {
    private socket: Socket | null = null;

    connect(backendUrl: string): Socket {
        this.socket = io( '/',{
            path: backendUrl,
            transports: ['websocket'],
            autoConnect: true,
            reconnection: true,
            reconnectionAttempts: 10,
            reconnectionDelay: 10000,
            timeout: 20000,
        });
        return this.socket;
    }
    

    disconnect() {
        if (this.socket) {
            this.socket.disconnect();
            this.socket = null;
        }
    }

    createRoom(roomName: string) {
        if (this.socket) {
            this.socket.emit('create-room', roomName || undefined);
        }
    }

    nextQuestion(roomName: string, question: unknown) {
        if (this.socket) {
            this.socket.emit('next-question', { roomName, question });
        }
    }

    launchStudentModeQuiz(roomName: string, questions: unknown) {
        if (this.socket) {
            this.socket.emit('launch-student-mode', { roomName, questions });
        }
    }

    endQuiz(roomName: string) {
        if (this.socket) {
            this.socket.emit('end-quiz', { roomName });
            //Delete room in mongoDb, roomContainer will be deleted in cleanup
            apiService.deleteRoom(roomName);
        }
    }

    joinRoom(enteredRoomName: string, username: string) {
        if (this.socket) {
            this.socket.emit('join-room', { enteredRoomName, username });
        }
    }

    submitAnswer(answerData: AnswerSubmissionToBackendType
        // roomName: string,
        // answer: string | number | boolean,
        // username: string,
        // idQuestion: string
    ) {
        if (this.socket) {
            this.socket?.emit('submit-answer', 
            //     {
            //     answer: answer,
            //     roomName: roomName,
            //     username: username,
            //     idQuestion: idQuestion
            // }
            answerData
        );
        }
    }
}

const webSocketService = new WebSocketService();
export default webSocketService;
