export const event = "guildMemberUpdate";

export async function callback(client, before, after) {
    try {
        const { log, NucleusColors, entry, renderUser, renderDelta, getAuditLog } = after.client.logger;
        const auditLog = await getAuditLog(after.guild, "MEMBER_UPDATE");
        const audit = auditLog.entries.filter(entry => entry.target.id === after.id).first();
        if (audit.executor.id === client.user.id) return;
        if (before.nickname !== after.nickname) {
            await client.database.history.create(
                "nickname", after.guild.id, after.user, audit.executor,
                null, before.nickname || before.user.username, after.nickname || after.user.username);
            const data = {
                meta: {
                    type: "memberUpdate",
                    displayName: "Nickname Changed",
                    calculateType: "guildMemberUpdate",
                    color: NucleusColors.yellow,
                    emoji: "PUNISH.NICKNAME.YELLOW",
                    timestamp: new Date().getTime()
                },
                list: {
                    memberId: entry(after.id, `\`${after.id}\``),
                    name: entry(after.user.id, renderUser(after.user)),
                    before: entry(before.nickname, before.nickname ? before.nickname : "*None*"),
                    after: entry(after.nickname, after.nickname ? after.nickname : "*None*"),
                    changed: entry(new Date().getTime(), renderDelta(new Date().getTime())),
                    changedBy: entry(audit.executor.id, renderUser(audit.executor))
                },
                hidden: {
                    guild: after.guild.id
                }
            };
            log(data);
        } else if (before.communicationDisabledUntilTimestamp < new Date().getTime() && after.communicationDisabledUntil > new Date().getTime()) {
            await client.database.history.create(
                "mute", after.guild.id, after.user, audit.executor, audit.reason, null, null, null
            );
            const data = {
                meta: {
                    type: "memberMute",
                    displayName: "Muted",
                    calculateType: "guildMemberPunish",
                    color: NucleusColors.yellow,
                    emoji: "PUNISH.MUTE.YELLOW",
                    timestamp: new Date().getTime()
                },
                list: {
                    memberId: entry(after.id, `\`${after.id}\``),
                    name: entry(after.user.id, renderUser(after.user)),
                    mutedUntil: entry(after.communicationDisabledUntilTimestamp, renderDelta(after.communicationDisabledUntilTimestamp)),
                    muted: entry(new Date().getTime(), renderDelta(new Date().getTime())),
                    mutedBy: entry(audit.executor.id, renderUser(audit.executor)),
                    reason: entry(audit.reason, audit.reason ? audit.reason : "\n> *No reason provided*")
                },
                hidden: {
                    guild: after.guild.id
                }
            };
            log(data);
            client.database.eventScheduler.schedule("naturalUnmute", after.communicationDisabledUntil,
                {guild: after.guild.id, user: after.id, expires: after.communicationDisabledUntilTimestamp}
            );
        } else if (
            after.communicationDisabledUntil === null && before.communicationDisabledUntilTimestamp !== null &&
            new Date().getTime() >= audit.createdTimestamp
        ) {
            await client.database.history.create(
                "unmute", after.guild.id, after.user, audit.executor, null, null, null, null
            );
            const data = {
                meta: {
                    type: "memberUnmute",
                    displayName: "Unmuted",
                    calculateType: "guildMemberPunish",
                    color: NucleusColors.green,
                    emoji: "PUNISH.MUTE.GREEN",
                    timestamp: new Date().getTime()
                },
                list: {
                    memberId: entry(after.id, `\`${after.id}\``),
                    name: entry(after.user.id, renderUser(after.user)),
                    unmuted: entry(new Date().getTime(), renderDelta(new Date().getTime())),
                    unmutedBy: entry(audit.executor.id, renderUser(audit.executor))
                },
                hidden: {
                    guild: after.guild.id
                }
            };
            log(data);
            client.database.eventScheduler.cancel("naturalUnmute", {guild: after.guild.id, user: after.id, expires: before.communicationDisabledUntilTimestamp});
        }
    } catch (e) { console.log(e); }
}
