"use client";

import { useEffect, useRef } from "react";
import { useDispatch, useSelector } from "react-redux";
import {
    incrementUnread,
    setUnreadCounts,
} from "@/lib/Features/UnreadCountSlice/unreadCountSlice";
import { AppStore } from "@/lib/store";
import { shouldCountMessageAsBrandUnread } from "@/Component/Messages/BrandMessages/stageUtils";

const UnreadManager = () => {
    const dispatch = useDispatch();
    const activeGroupId = useSelector(
        (state: AppStore) => state.unreadCountSlice?.activeGroupId ?? null
    );
    const activeGroupIdRef = useRef(activeGroupId);
    activeGroupIdRef.current = activeGroupId;

    useEffect(() => {
        let listenerID = "GlobalUnreadListener";
        let CometChatRef: any = null;

        const normalizeGuid = (id: string) => String(id || "").replace(/^group_/, "");

        const shouldCountUnread = (receiverId: string) => {
            const active = activeGroupIdRef.current;
            if (!active) return true;
            return normalizeGuid(receiverId) !== normalizeGuid(active);
        };

        const handleIncoming = (msg: any) => {
            const receiverType =
                msg?.receiverType ||
                msg?.getReceiverType?.() ||
                "";
            if (
                receiverType !== "group" &&
                receiverType !== CometChatRef?.RECEIVER_TYPE?.GROUP
            ) {
                return;
            }
            const receiverId =
                msg?.receiverId ||
                msg?.getReceiverId?.() ||
                msg?.receiver ||
                "";
            if (!receiverId || !shouldCountUnread(receiverId)) return;
            if (!shouldCountMessageAsBrandUnread(msg)) return;
            // Store under bare guid so list + activeGroupId keys match
            dispatch(incrementUnread(normalizeGuid(receiverId)));
        };

        const init = async () => {
            const { CometChat } = await import("@cometchat/chat-sdk-javascript");
            CometChatRef = CometChat;

            CometChat.getUnreadMessageCountForAllGroups().then(
                (counts: any) => {
                    dispatch(setUnreadCounts(counts || {}));
                },
                (error) => console.error("Unread fetch error", error)
            );

            CometChat.addMessageListener(
                listenerID,
                new CometChat.MessageListener({
                    onTextMessageReceived: handleIncoming,
                    onMediaMessageReceived: handleIncoming,
                    onCustomMessageReceived: handleIncoming,
                })
            );
        };

        init();

        return () => {
            if (CometChatRef) {
                CometChatRef.removeMessageListener(listenerID);
            }
        };
    }, [dispatch]);

    return null;
};

export default UnreadManager;
