import { getCommandMentionByName } from "./../utils/getCommandDataByName.js";
import convertCurlyBracketString from "../utils/convertCurlyBracketString.js";
import client from "../utils/client.js";
import EmojiEmbed from "../utils/generateEmojiEmbed.js";
import { GuildChannel, GuildMember, BaseGuildTextChannel } from "discord.js";
import singleNotify from "../utils/singleNotify.js";

export async function callback(member: GuildMember) {
    if (member.user.bot) return;
    const config = await client.database.guilds.read(member.guild.id);
    if (!config.welcome.enabled) return;

    if (config.welcome.channel) {
        let string = config.welcome.message;
        if (string) {
            string = await convertCurlyBracketString(
                string,
                member.id,
                member.displayName,
                member.guild.name,
                member.guild.members
            );
            if (config.welcome.channel === "dm") {
                await member.send({
                    embeds: [new EmojiEmbed().setDescription(string).setStatus("Success")]
                });
            } else {
                const channel: GuildChannel | null = (await member.guild.channels.fetch(
                    config.welcome.channel
                )) as GuildChannel | null;
                if (!channel)
                    return await singleNotify(
                        "welcomeChannelDeleted",
                        member.guild.id,
                        `The welcome channel has been deleted or is no longer accessible. Use ${getCommandMentionByName(
                            "settings/welcome"
                        )} to set a new one`,
                        "Warning"
                    );
                if (!(channel instanceof BaseGuildTextChannel)) return;
                if (channel.guild.id !== member.guild.id) return;
                try {
                    await channel.send({
                        embeds: [new EmojiEmbed().setDescription(string).setStatus("Success")],
                        content: (config.welcome.ping ? `<@&${config.welcome.ping}>` : "") + `<@${member.id}>`
                    });
                } catch (err) {
                    await singleNotify(
                        "welcomeChannelDeleted",
                        member.guild.id,
                        `The welcome channel has been deleted or is no longer accessible. Use ${getCommandMentionByName(
                            "settings/welcome"
                        )} to set a new one`,
                        "Warning"
                    );
                }
            }
        }
    }
}
