/*
 * -------------------------------------------------------------------------
 * This file is part of the MindStudio project.
 * Copyright (c) 2026 Huawei Technologies Co.,Ltd.
 *
 * MindStudio is licensed under Mulan PSL v2.
 * You can use this software according to the terms and conditions of the Mulan PSL v2.
 * You may obtain a copy of Mulan PSL v2 at:
 *
 *          http://license.coscl.org.cn/MulanPSL2
 *
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 * See the Mulan PSL v2 for more details.
 * -------------------------------------------------------------------------
 */

import { store } from '../store';
import { useEffect } from 'react';
import { BlockWorker } from './blockWorker/worker';
import { StateWorker } from './stateWorker/worker';
import { runInAction } from 'mobx';

const { sessionStore } = store;
const session = sessionStore.activeSession;
const useWorkerMessage = (): void => {
    useEffect(() => {
        BlockWorker.onmessage = (ev: MessageEvent<any>): void => {
            if (session === undefined) {
                return;
            }
            switch (ev.data.type) {
                case 'dataInfo':
                    runInAction(() => {
                        session.leaksWorkerInfo.sizeInfo = ev.data.sizeInfo;
                        session.leaksWorkerInfo.renderOptions.zoom = ev.data.zoom;
                    });
                    break;
                case 'hoverItemResult':
                    runInAction(() => {
                        session.leaksWorkerInfo.hoverItem = ev.data.result;
                    });
                    break;
                case 'clickItemResult':
                    if (ev.data.selectionVersion !== undefined && ev.data.selectionVersion !== session.selectionVersion) {
                        return;
                    }
                    runInAction(() => {
                        session.leaksWorkerInfo.clickItem = ev.data.result;
                    });
                    break;
                case 'transformResult':
                    runInAction(() => {
                        session.leaksWorkerInfo.renderOptions.transform = ev.data.transform;
                    });
                    break;
                case 'renderCompleted':
                    runInAction(() => {
                        session.loadingBlocks = false;
                    });
                    break;
                default:
                    break;
            }
        };

        StateWorker.onmessage = (ev: MessageEvent<any>): void => {
            if (session === undefined) {
                return;
            }
            switch (ev.data.type) {
                case 'hoverItemResult':
                    runInAction(() => {
                        session.stateWorkerInfo.hoverItem = ev.data.result;
                    });
                    break;
                case 'clickItemResult':
                    if (ev.data.selectionVersion !== undefined && ev.data.selectionVersion !== session.selectionVersion) {
                        return;
                    }
                    runInAction(() => {
                        session.stateWorkerInfo.clickItem = ev.data.result;
                    });
                    break;
                default:
                    break;
            }
        };
    }, []);
};

export default useWorkerMessage;