import { DataStore } from "@api/index";
import { Devs } from "@utils/constants";
import definePlugin from "@utils/types";
import { cache } from "@webpack";
import { Constants, MessageStore, RestAPI, UserStore } from "@webpack/common";
import { Message } from "discord-types/general";

const DATA_STORE_KEY = "huskchart";
type Husk = {
    userId: string;
    channelId: string;
    messageId: string;
};
const messageCache = new Map<string, {
    message?: Message;
    fetched: boolean;
}>();

async function getMessage(channelId: string, messageId: string): Promise<Message | undefined> {
    const cached = messageCache.get(messageId);
    if (cached) return cached?.message;

    const storeMessage = MessageStore.getMessage(channelId, messageId);
    if (storeMessage) {
        messageCache.set(storeMessage.id, {
            message: storeMessage,
            fetched: false
        });
        return storeMessage;
    }

    const apiMessage = await RestAPI.get({
        url: Constants.Endpoints.MESSAGES(channelId),
        query: {
            limit: 1,
            around: messageId
        },
        retries: 2
    }).catch(() => null);
    if (apiMessage) {
        messageCache.set(apiMessage.body[0].id, {
            message: apiMessage,
            fetched: true
        });
        return apiMessage.body[0];
    }
}
export default definePlugin({
    name: "HuskChart",
    description: "See how much you've been husked, and by who",
    authors: [Devs.nin0dev],
    flux: {
        async MESSAGE_REACTION_ADD(event) {
            const msg = await getMessage(event.channelId, event.messageId);
            if (msg!.author.id !== UserStore.getCurrentUser().id) return;
            if (!event.emoji.name.includes("husk")) return;
            let husks: Husk[] = await DataStore.get(DATA_STORE_KEY) || [];
            husks.push({
                userId: event.userId,
                channelId: event.channelId,
                messageId: event.messageId
            });
            DataStore.set(DATA_STORE_KEY, husks);
        }
    }
});
