import humanizeDuration from "humanize-duration";
export const event = "threadDelete";

export async function callback(client, thread) {
    const { getAuditLog, log, NucleusColors, entry, renderUser, renderDelta, renderChannel } = thread.client.logger;
    const auditLog = await getAuditLog(thread.guild, "THREAD_UPDATE");
    const audit = auditLog.entries.filter((entry) => entry.target.id === thread.id).first();
    if (audit.executor.id === client.user.id) return;
    const data = {
        meta: {
            type: "channelDelete",
            displayName: "Thread Deleted",
            calculateType: "channelUpdate",
            color: NucleusColors.red,
            emoji: "CHANNEL.TEXT.DELETE",
            timestamp: new Date().getTime()
        },
        list: {
            threadId: entry(thread.id, `\`${thread.id}\``),
            name: entry(thread.name, thread.name),
            parentChannel: entry(thread.parentId, renderChannel(thread.parent)),
            category: entry(
                thread.parent.parent ? thread.parent.parent.name : "None",
                thread.parent.parent ? renderChannel(thread.parent.parent) : "None"
            ),
            autoArchiveDuration: entry(
                thread.autoArchiveDuration,
                humanizeDuration(thread.autoArchiveDuration * 60 * 1000, {
                    round: true
                })
            ),
            membersInThread: entry(thread.memberCount, thread.memberCount),
            deletedBy: entry(audit.executor.id, renderUser(audit.executor)),
            created: entry(thread.createdTimestamp, renderDelta(thread.createdTimestamp)),
            deleted: entry(new Date().getTime(), renderDelta(new Date().getTime()))
        },
        hidden: {
            guild: thread.guild.id
        }
    };
    log(data);
}
