import { RoomEngineObjectEvent, RoomEngineRoomAdEvent, RoomEngineTriggerWidgetEvent, RoomEngineUseProductEvent, RoomId, RoomSessionErrorMessageEvent, RoomZoomEvent } from '@nitrots/nitro-renderer';
import { FC } from 'react';
import { DispatchUiEvent, GetRoomEngine, LocalizeText, NotificationAlertType, NotificationUtilities, RoomWidgetUpdateRoomObjectEvent } from '../../../api';
import { useRoom, useRoomEngineEvent, useRoomSessionManagerEvent } from '../../../hooks';
import { AvatarInfoWidgetView } from './avatar-info/AvatarInfoWidgetView';
import { ChatInputView } from './chat-input/ChatInputView';
import { ChatWidgetView } from './chat/ChatWidgetView';
import { FurniChooserWidgetView } from './choosers/FurniChooserWidgetView';
import { UserChooserWidgetView } from './choosers/UserChooserWidgetView';
import { DoorbellWidgetView } from './doorbell/DoorbellWidgetView';
import { FriendRequestWidgetView } from './friend-request/FriendRequestWidgetView';
import { FurnitureWidgetsView } from './furniture/FurnitureWidgetsView';
import { RoomThumbnailWidgetView } from './room-thumbnail/RoomThumbnailWidgetView';
import { RoomToolsWidgetView } from './room-tools/RoomToolsWidgetView';
import { WordQuizWidgetView } from './word-quiz/WordQuizWidgetView';

export const RoomWidgetsView: FC<{}> = props =>
{
    const { roomSession = null } = useRoom();

    useRoomEngineEvent<RoomZoomEvent>(RoomZoomEvent.ROOM_ZOOM, event => GetRoomEngine().setRoomInstanceRenderingCanvasScale(event.roomId, 1, event.level, null, null, false, event.asDelta));

    useRoomEngineEvent<RoomEngineObjectEvent>(
        [
            RoomEngineTriggerWidgetEvent.REQUEST_TEASER,
            RoomEngineTriggerWidgetEvent.REQUEST_ECOTRONBOX,
            RoomEngineTriggerWidgetEvent.REQUEST_CLOTHING_CHANGE,
            RoomEngineTriggerWidgetEvent.REQUEST_PLAYLIST_EDITOR,
            RoomEngineTriggerWidgetEvent.OPEN_WIDGET,
            RoomEngineTriggerWidgetEvent.CLOSE_WIDGET,
            RoomEngineRoomAdEvent.FURNI_CLICK,
            RoomEngineRoomAdEvent.FURNI_DOUBLE_CLICK,
            RoomEngineRoomAdEvent.TOOLTIP_SHOW,
            RoomEngineRoomAdEvent.TOOLTIP_HIDE,
        ], event =>
        {
            if(!roomSession) return;

            const objectId = event.objectId;
            const category = event.category;

            let updateEvent: RoomWidgetUpdateRoomObjectEvent = null;

            switch(event.type)
            {
                case RoomEngineTriggerWidgetEvent.REQUEST_TEASER:
                    //widgetHandler.processWidgetMessage(new RoomWidgetFurniToWidgetMessage(RoomWidgetFurniToWidgetMessage.REQUEST_TEASER, objectId, category, event.roomId));
                    break;
                case RoomEngineTriggerWidgetEvent.REQUEST_ECOTRONBOX:
                    //widgetHandler.processWidgetMessage(new RoomWidgetFurniToWidgetMessage(RoomWidgetFurniToWidgetMessage.REQUEST_ECOTRONBOX, objectId, category, event.roomId));
                    break;
                case RoomEngineTriggerWidgetEvent.REQUEST_PLACEHOLDER:
                    //widgetHandler.processWidgetMessage(new RoomWidgetFurniToWidgetMessage(RoomWidgetFurniToWidgetMessage.REQUEST_PLACEHOLDER, objectId, category, event.roomId));
                    break;
                case RoomEngineTriggerWidgetEvent.REQUEST_CLOTHING_CHANGE:
                    //widgetHandler.processWidgetMessage(new RoomWidgetFurniToWidgetMessage(RoomWidgetFurniToWidgetMessage.REQUEST_CLOTHING_CHANGE, objectId, category, event.roomId));
                    break;
                case RoomEngineTriggerWidgetEvent.REQUEST_PLAYLIST_EDITOR:
                    //widgetHandler.processWidgetMessage(new RoomWidgetFurniToWidgetMessage(RoomWidgetFurniToWidgetMessage.REQUEST_PLAYLIST_EDITOR, objectId, category, event.roomId));
                    break;
                case RoomEngineTriggerWidgetEvent.OPEN_WIDGET:
                case RoomEngineTriggerWidgetEvent.CLOSE_WIDGET:
                case RoomEngineUseProductEvent.USE_PRODUCT_FROM_ROOM:
                    //widgetHandler.processEvent(event);
                    break;
                case RoomEngineRoomAdEvent.FURNI_CLICK:
                case RoomEngineRoomAdEvent.FURNI_DOUBLE_CLICK:
                    //handleRoomAdClick(event);
                    break;
                case RoomEngineRoomAdEvent.TOOLTIP_SHOW:
                case RoomEngineRoomAdEvent.TOOLTIP_HIDE:
                    //handleRoomAdTooltip(event);
                    break;
            }

            if(!updateEvent) return;
            
            let dispatchEvent = true;

            if(RoomId.isRoomPreviewerId(updateEvent.roomId)) return;

            if(updateEvent instanceof RoomWidgetUpdateRoomObjectEvent) dispatchEvent = (!RoomId.isRoomPreviewerId(updateEvent.roomId));

            if(dispatchEvent) DispatchUiEvent(updateEvent);
        });

    useRoomSessionManagerEvent<RoomSessionErrorMessageEvent>(
        [
            RoomSessionErrorMessageEvent.RSEME_KICKED,
            RoomSessionErrorMessageEvent.RSEME_PETS_FORBIDDEN_IN_HOTEL,
            RoomSessionErrorMessageEvent.RSEME_PETS_FORBIDDEN_IN_FLAT,
            RoomSessionErrorMessageEvent.RSEME_MAX_PETS,
            RoomSessionErrorMessageEvent.RSEME_MAX_NUMBER_OF_OWN_PETS,
            RoomSessionErrorMessageEvent.RSEME_NO_FREE_TILES_FOR_PET,
            RoomSessionErrorMessageEvent.RSEME_SELECTED_TILE_NOT_FREE_FOR_PET,
            RoomSessionErrorMessageEvent.RSEME_BOTS_FORBIDDEN_IN_HOTEL,
            RoomSessionErrorMessageEvent.RSEME_BOTS_FORBIDDEN_IN_FLAT,
            RoomSessionErrorMessageEvent.RSEME_BOT_LIMIT_REACHED,
            RoomSessionErrorMessageEvent.RSEME_SELECTED_TILE_NOT_FREE_FOR_BOT,
            RoomSessionErrorMessageEvent.RSEME_BOT_NAME_NOT_ACCEPTED,
        ], event =>
        {
            let errorTitle = LocalizeText('error.title');
            let errorMessage: string = '';

            switch(event.type)
            {
                case RoomSessionErrorMessageEvent.RSEME_MAX_PETS:
                    errorMessage = LocalizeText('room.error.max_pets');
                    break;
                case RoomSessionErrorMessageEvent.RSEME_MAX_NUMBER_OF_OWN_PETS:
                    errorMessage = LocalizeText('room.error.max_own_pets');
                    break;
                case RoomSessionErrorMessageEvent.RSEME_KICKED:
                    errorMessage = LocalizeText('room.error.kicked');
                    errorTitle = LocalizeText('generic.alert.title');
                    break;
                case RoomSessionErrorMessageEvent.RSEME_PETS_FORBIDDEN_IN_HOTEL:
                    errorMessage = LocalizeText('room.error.pets.forbidden_in_hotel');
                    break;
                case RoomSessionErrorMessageEvent.RSEME_PETS_FORBIDDEN_IN_FLAT:
                    errorMessage = LocalizeText('room.error.pets.forbidden_in_flat');
                    break;
                case RoomSessionErrorMessageEvent.RSEME_NO_FREE_TILES_FOR_PET:
                    errorMessage = LocalizeText('room.error.pets.no_free_tiles');
                    break;
                case RoomSessionErrorMessageEvent.RSEME_SELECTED_TILE_NOT_FREE_FOR_PET:
                    errorMessage = LocalizeText('room.error.pets.selected_tile_not_free');
                    break;
                case RoomSessionErrorMessageEvent.RSEME_BOTS_FORBIDDEN_IN_HOTEL:
                    errorMessage = LocalizeText('room.error.bots.forbidden_in_hotel');
                    break;
                case RoomSessionErrorMessageEvent.RSEME_BOTS_FORBIDDEN_IN_FLAT:
                    errorMessage = LocalizeText('room.error.bots.forbidden_in_flat');
                    break;
                case RoomSessionErrorMessageEvent.RSEME_BOT_LIMIT_REACHED:
                    errorMessage = LocalizeText('room.error.max_bots');
                    break;
                case RoomSessionErrorMessageEvent.RSEME_SELECTED_TILE_NOT_FREE_FOR_BOT:
                    errorMessage = LocalizeText('room.error.bots.selected_tile_not_free');
                    break;
                case RoomSessionErrorMessageEvent.RSEME_BOT_NAME_NOT_ACCEPTED:
                    errorMessage = LocalizeText('room.error.bots.name.not.accepted');
                    break;
                default:
                    return;
            }

            NotificationUtilities.simpleAlert(errorMessage, NotificationAlertType.DEFAULT, null, null, errorTitle);
        });

    return (
        <>
            <AvatarInfoWidgetView />
            <ChatWidgetView />
            <ChatInputView />
            <DoorbellWidgetView />
            <FurnitureWidgetsView />
            <RoomToolsWidgetView />
            <RoomThumbnailWidgetView />
            <FurniChooserWidgetView />
            <UserChooserWidgetView />
            <WordQuizWidgetView />
            <FriendRequestWidgetView />
        </>
    );
}
