import { Request, ResponseToolkit } from '@hapi/hapi'
import { Common } from "../../utils/common";

import { ServerService } from "../services/server.service";

export class ServerHandler {
    private getServerServiceObject = async (request: Request) => {
        let variables = await Common.getVariables(request);
        let serverService = new ServerService(variables);
        return serverService;
    }
    serverStatus = async (req: Request, h: ResponseToolkit) => {
        let serverStatus = { message: "REQUEST_PROCESSED_SUCCESSFULLY", responseData: { status: "server is running" } }
        return h.response(serverStatus).code(200)
    }

    runCron = async (request: Request, h: ResponseToolkit) => {
        let serverService = await this.getServerServiceObject(request);
        await serverService.executeCron(request.params.name);
        let serverStatus = { message: "REQUEST_PROCESSED_SUCCESSFULLY", responseData: {} }
        return h.response(serverStatus).code(200)
    }

    socketTest = async (req: Request, h: ResponseToolkit) => {
        //io.emit('testEvent', { 'onlineStatus': { userId: 1, onlineStatus: 1 } })
        await Common.EmitEvent("user_1_1", 'testEvent', { 'onlineStatus': { userId: 1, onlineStatus: 1 } })
        return {}
    }

    serverEvents = async (request: Request, h: ResponseToolkit) => {
        try {
            let scheduleService = await this.getServerServiceObject(request);
            const { event, payload } = request.payload as unknown as ServerEventData;
            switch (event) {
                case 'join_room': {
                    let requestData = payload as unknown as JoinRoomRequest;
                    await scheduleService.joinRoom(requestData)
                    return h.response({ message: "" }).code(200)
                    break;
                }
                case 'disconnected': {
                    let requestData = payload as unknown as DisconnectRequest;
                    let returnStatus = await scheduleService.disconnect(requestData);
                    return h.response({ message: "", responseData: { status: returnStatus } }).code(200)
                    break;
                }
                case 'userActive': {
                    let requestData = payload as unknown as UserActiveRequest;
                    let returnStatus = await scheduleService.userActive(requestData);
                    return h.response({ message: "", responseData: { status: returnStatus } }).code(200)
                    break;
                }
                case 'userAway': {
                    let requestData = payload as unknown as UserAwayRequest;
                    let returnStatus = await scheduleService.userAway(requestData);
                    return h.response({ message: "", responseData: { status: returnStatus } }).code(200)
                    break;
                }
            }
        } catch (err) {
            return {}
        }
    }
}