import { useEffect, useState } from "react";
import { useGroupInformation } from "./useGroupInformation";
import { PacketGroupInfo } from "../ProtocolProvider/protocol/packets/packet.group.info";
import { usePacket } from "../ProtocolProvider/usePacket";
import { useSender } from "../ProtocolProvider/useSender";
import { useGroups } from "../DialogProvider/useGroups";
import { useMemory } from "../MemoryProvider/useMemory";

/**
 * Хук для получения участников группы
 * @param groupId ид группы
 * @param force принудительное обновление, если true, то будет 
 * отправлен запрос на сервер и получен актуальный список участников,
 * если false, то будет возвращено значение из памяти
 * @returns 
 */
export function useGroupMembers(groupId: string, force?: boolean) : {
    members: string[];
    loading: boolean;
} {
    const send = useSender();
    const {normalize, hasGroup} = useGroups();
    const {markAsDeleted} = useGroupInformation(normalize(groupId));
    const [members, setMembers] = useMemory<string[]>("members_group_" + groupId, [], true);
    const [loading, setLoading] = useState(false);

    useEffect(() => {
        updateGroupMembers();
    }, [groupId]);

    const updateGroupMembers = () => {
        if((!hasGroup(groupId) && groupId.length > 16)
            || (members.length > 0 && !force)
        ){
            /**
             * Не ID группы, пропускаем. Если ид группы больше 16 символов 
             * и не начинается с #group:, то это не группа.
             * Однако если ID меньше 16 символов, то это и не
             * публичный ключ. Значит скорее всего это ID группы.
             * 
             * Это условие нужно для оптимизации запросов на сервер.
             */
            return;
        }
        setLoading(true);
        let packet = new PacketGroupInfo();
        packet.setGroupId(normalize(groupId));
        send(packet);
    }
    
    usePacket(0x12, (packet: PacketGroupInfo) => {
        if(packet.getGroupId() != normalize(groupId)){
            return;
        }
        const members = packet.getMembers();
        if(members.length <= 0){
            setLoading(false);
            markAsDeleted();
            return;
        }
        setLoading(false);
        setMembers(members);
    }, [groupId]);

    return {
        members,
        loading
    };
}