// retoor <retoor@molodetz.nl>

import { Http } from "./Http.js";

export class ReportDialog {
    constructor() {
        this.overlay = document.getElementById("report-dialog");
        this.form = document.getElementById("report-form");
        this.target = null;
        document.addEventListener("click", (e) => {
            const btn = e.target.closest("[data-report-type]");
            if (!btn || btn.disabled) return;
            e.preventDefault();
            this.open(btn.dataset.reportType, btn.dataset.reportUid);
        });
        if (this.form) {
            this.form.addEventListener("submit", (e) => {
                e.preventDefault();
                e.stopImmediatePropagation();
                this.submit();
            });
        }
    }

    open(targetType, targetUid) {
        if (!this.overlay || !this.form) return;
        this.target = { targetType, targetUid };
        this.form.reset();
        this.overlay.classList.add("visible");
        const reason = this.form.querySelector("[name='reason']");
        if (reason) reason.focus();
    }

    close() {
        if (this.overlay) this.overlay.classList.remove("visible");
        this.target = null;
    }

    async submit() {
        if (!this.target) return;
        const data = new FormData(this.form);
        const button = this.form.querySelector("button[type='submit']");
        if (button) button.disabled = true;
        try {
            const result = await Http.sendForm(
                `/reports/${this.target.targetType}/${this.target.targetUid}`,
                { reason: data.get("reason"), detail: data.get("detail") || "" },
                { silent: true },
            );
            const hours = result && result.data ? result.data.sla_hours : null;
            this.close();
            this.notify(
                hours
                    ? `Report received. A moderator reviews it within ${hours} hours.`
                    : "Report received.",
                "success",
            );
        } catch (err) {
            this.notify(err.message, "error");
        } finally {
            if (button) button.disabled = false;
        }
    }

    notify(message, type) {
        if (window.app && window.app.toast) {
            window.app.toast.show(message, { type });
            return;
        }
        console.info(message);
    }
}

window.ReportDialog = ReportDialog;
