// Copyright (c) 2025, Huawei Technologies Co., Ltd.
// All rights reserved.
//
// Licensed under the Apache License, Version 2.0  (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

import { useSetAtom } from 'jotai';
import {
    dynamicNodesAtom,
    searchResultAtom,
    thumbnailInfoAtom,
    useSelectionHistory,
} from './stores';
import WebWorker from './worker';
import { useEffect } from 'react';

const useWorkerMessage = (): void => {
    const setSearchResult = useSetAtom(searchResultAtom);
    const setDynamicNodes = useSetAtom(dynamicNodesAtom);
    const setThumbnailInfo = useSetAtom(thumbnailInfoAtom);
    const { update, clear } = useSelectionHistory();

    useEffect(() => {
        WebWorker.onmessage = ({ data: payload }): void => {
            switch (payload.type) {
                case 'search/ret':
                    setSearchResult(payload.nodes);
                    break;

                case 'hit-test/ret': {
                    const { type = null, data: hitData } = payload.data;

                    if (type === 'node') {
                        update(hitData.id);
                    } else if (type === 'edge') {
                        update({ source: hitData.source, target: hitData.target });
                    } else { clear(); }
                    break;
                }

                case 'dynamic-nodes':
                    setDynamicNodes(payload.dynamicNodes);
                    break;

                case 'thumbnail/info':
                    setThumbnailInfo(payload.thumbnailInfo);
                    break;
            }
        };
    }, []);
};

export default useWorkerMessage;