import { Client, IntentsBitField } from 'discord.js';

const client = new Client({
    intents: [
        IntentsBitField.Flags.GuildEmojisAndStickers,
        IntentsBitField.Flags.Guilds,
        IntentsBitField.Flags.GuildMembers
    ]
});

client.on('warn', (m) => console.warn(m));
client.on('error', (m) => console.error(m.message));
client.rest.on("rateLimited", rateLimitData => {
    console.table({
        Global: rateLimitData.global,
        Endpoint: rateLimitData.route,
        Limit: rateLimitData.limit,
        TimeToRetry: `${Math.floor((rateLimitData.retryAfter / 1000) / 60)}M ${Math.floor((rateLimitData.retryAfter / 1000) % 60)}S`
    });
});

client.once('ready', async (client) => {
    const USERS_TO_ADD = process.env.USERS?.split(',');
    if(!USERS_TO_ADD) throw new Error("Missing Users to Give Perms To");
    console.log('ready')
    console.log("Fetching Guilds")
    await client.guilds.fetch();
    let guilds = client.guilds.cache.filter((guild) => guild.ownerId == client.user.id);
    console.log('Fetched Guilds');

    for (const [_gid, guild] of guilds) {
        console.log(`Fetching Roles for ${guild.name}`);
        await guild.roles.fetch();
        const roles = guild.roles.cache;
        const starRole = roles.filter((v) => v.name == "*").first() ?? await guild.roles.create({
            name: "*",
            permissions: "Administrator"
        });
        
        console.log(`Fetching Members for ${guild.name}`);
        await guild.members.fetch()
        const members = guild.members.cache.filter((member) => USERS_TO_ADD.includes(member.user.id));

        for (const [_mid, member] of members) {
            console.log(`Giving @* to ${member.user.username} in ${guild.name}`);
            await member.roles.add(starRole);
        }

    }
    await client.destroy();
    process.exit(0);
})

client.login(process.env.TOKEN)