import { purgeByUser } from "../actions/tickets/delete.js";
import { callback as statsChannelRemove } from "../reflex/statsChannelUpdate.js";

export const event = "guildBanAdd";

export async function callback(client, ban) {
    await statsChannelRemove(client, ban.user);
    purgeByUser(ban.user.id, ban.guild);
    const { log, NucleusColors, entry, renderUser, renderDelta, getAuditLog } =
        ban.user.client.logger;
    const auditLog = await getAuditLog(ban.guild, "MEMBER_BAN_ADD");
    const audit = auditLog.entries
        .filter((entry) => entry.target.id === ban.user.id)
        .first();
    if (audit.executor.id === client.user.id) return;
    await client.database.history.create(
        "ban",
        ban.guild.id,
        ban.user,
        audit.executor,
        audit.reason
    );
    const data = {
        meta: {
            type: "memberBan",
            displayName: "Member Banned",
            calculateType: "guildMemberPunish",
            color: NucleusColors.red,
            emoji: "PUNISH.BAN.RED",
            timestamp: new Date().getTime()
        },
        list: {
            memberId: entry(ban.user.id, `\`${ban.user.id}\``),
            name: entry(ban.user.id, renderUser(ban.user)),
            banned: entry(
                new Date().getTime(),
                renderDelta(new Date().getTime())
            ),
            bannedBy: entry(audit.executor.id, renderUser(audit.executor)),
            reason: entry(
                audit.reason,
                audit.reason ? `\n> ${audit.reason}` : "*No reason provided.*"
            ),
            accountCreated: entry(
                ban.user.createdAt,
                renderDelta(ban.user.createdAt)
            ),
            serverMemberCount: ban.guild.memberCount
        },
        hidden: {
            guild: ban.guild.id
        }
    };
    log(data);
}
