export default class DhpChatMessage extends foundry.documents.ChatMessage {
    async renderHTML() {
        if (this.system.messageTemplate)
            this.content = await foundry.applications.handlebars.renderTemplate(this.system.messageTemplate, {
                ...this.system,
                _source: this.system._source
            });

        const actor = game.actors.get(this.speaker.actor);
        const actorData = actor ?? {
            img: this.author.avatar ? this.author.avatar : 'icons/svg/mystery-man.svg',
            name: ''
        };
        /* We can change to fully implementing the renderHTML function if needed, instead of augmenting it. */
        const html = await super.renderHTML({ actor: actorData, author: this.author });
        this.applyPermission(html);

        if (this.type === 'dualityRoll') {
            html.classList.add('duality');
            switch (this.system.roll?.result?.duality) {
                case 1:
                    html.classList.add('hope');
                    break;
                case -1:
                    html.classList.add('fear');
                    break;
                default:
                    html.classList.add('critical');
                    break;
            }
        }

        return html;
    }

    applyPermission(html) {
        const elements = html.querySelectorAll('[data-perm-id]');
        elements.forEach(e => {
            const uuid = e.dataset.permId,
                document = fromUuidSync(uuid);
            e.setAttribute('data-view-perm', document.testUserPermission(game.user, 'OBSERVER'));
            e.setAttribute('data-use-perm', document.testUserPermission(game.user, 'OWNER'));
        });
    }

    async _preCreate(data, options, user) {
        options.speaker = ChatMessage.getSpeaker();
        const rollActorOwner = data.rolls?.[0]?.data?.parent?.owner;
        if (rollActorOwner) {
            data.author = rollActorOwner ? rollActorOwner.id : data.author;
            await this.updateSource({ author: rollActorOwner ?? user });
        }

        return super._preCreate(data, options, rollActorOwner ?? user);
    }
}
