import getEmojiByName from "../utils/getEmojiByName.js";

export const event = "channelDelete";

export async function callback(client, channel) {
    const { getAuditLog, log, NucleusColors, entry, renderDelta, renderUser } = channel.client.logger;

    const auditLog = await getAuditLog(channel.guild, "CHANNEL_DELETE");
    const audit = auditLog.entries.filter(entry => entry.target.id === channel.id).first();
    if (audit.executor.id === client.user.id) return;

    let emoji;
    let readableType;
    let displayName;
    switch (channel.type) {
    case "GUILD_TEXT": {
        emoji = "CHANNEL.TEXT.DELETE";
        readableType = "Text";
        displayName = "Text Channel";
        break;
    }
    case "GUILD_VOICE": {
        emoji = "CHANNEL.VOICE.DELETE";
        readableType = "Voice";
        displayName = "Voice Channel";
        break;
    }
    case "GUILD_CATEGORY": {
        emoji = "CHANNEL.CATEGORY.DELETE";
        readableType = "Category";
        displayName = "Category";
        break;
    }
    default: {
        emoji = "CHANNEL.TEXT.DELETE";
        readableType = "Channel";
        displayName = "Channel";
    }
    }
    const list = {
        channelId: entry(channel.id, `\`${channel.id}\``),
        name: entry(channel.id, `${channel.name}`),
        topic: null,
        type: entry(channel.type, readableType),
        category: entry(channel.parent ? channel.parent.id : null, channel.parent ? channel.parent.name : "Uncategorised"),
        nsfw: null,
        created: entry(channel.createdTimestamp, renderDelta(channel.createdTimestamp)),
        deleted: entry(new Date().getTime(), renderDelta(new Date().getTime())),
        deletedBy: entry(audit.executor.id, renderUser(audit.executor))
    };
    if (channel.topic !== null ?? false) list.topic = entry(channel.topic, `\`\`\`\n${channel.topic.replace("`", "'")}\n\`\`\``);
    else delete list.topic;
    if (channel.nsfw !== null ?? false) list.nsfw = entry(channel.nsfw, channel.nsfw ? `${getEmojiByName("CONTROL.TICK")} Yes` : `${getEmojiByName("CONTROL.CROSS")} No`);
    else delete list.nsfw;

    const data = {
        meta:{
            type: "channelDelete",
            displayName: displayName + " Deleted",
            calculateType: "channelUpdate",
            color: NucleusColors.red,
            emoji: emoji,
            timestamp: audit.createdTimestamp
        },
        list: list,
        hidden: {
            guild: channel.guild.id
        }
    };
    log(data);
}
