import { Grid } from "gridjs/dist/gridjs.umd.js";
import gridjs from "gridjs/dist/gridjs.umd.js";
import "gridjs/dist/gridjs.umd.js";
import GlobalConfig from "../global-config";

class Roles {
    constructor() {
        this.table = null; // Store Grid.js instance
    }

    init() {
        this.initTableRoles();
    }

    initTableRoles() {
        let tableContainer = document.getElementById("table-roles");

        // If table instance already exists, update it instead of re-creating
        if (this.table) {
            this.table
                .updateConfig({
                    server: {
                        url: `${GlobalConfig.apiHost}/api/api-roles`,
                        credentials: "include",
                        headers: {
                            Authorization: `Bearer ${document
                                .querySelector('meta[name="api-token"]')
                                .getAttribute("content")}`,
                            "Content-Type": "application/json",
                        },
                        then: (data) =>
                            data.data.map((item) => [
                                item.id,
                                item.name,
                                item.description,
                                item.id,
                            ]),
                        total: (data) => data.total,
                    },
                })
                .forceRender();
            return;
        }

        // Create a new Grid.js instance only if it doesn't exist
        this.table = new gridjs.Grid({
            columns: [
                "ID",
                "Name",
                "Description",
                {
                    name: "Action",
                    formatter: (cell) =>
                        gridjs.html(`
                            <div class="d-flex justify-content-end gap-x-2">
                                <a href="/roles/${cell}/edit" class="btn btn-yellow me-2">Update</a>
                                <a href="/roles/role-menu/${cell}" class="btn btn-yellow me-2">Role Menu</a>
                                <button class="btn btn-red btn-delete-role" data-id="${cell}">Delete</button>
                            </div>
                        `),
                },
            ],
            pagination: {
                limit: 15,
                server: {
                    url: (prev, page) =>
                        `${prev}${prev.includes("?") ? "&" : "?"}page=${
                            page + 1
                        }`,
                },
            },
            sort: true,
            search: {
                server: {
                    url: (prev, keyword) => `${prev}?search=${keyword}`,
                },
            },
            server: {
                url: `${GlobalConfig.apiHost}/api/api-roles`,
                credentials: "include",
                headers: {
                    Authorization: `Bearer ${document
                        .querySelector('meta[name="api-token"]')
                        .getAttribute("content")}`,
                    "Content-Type": "application/json",
                },
                then: (data) =>
                    data.data.map((item) => [
                        item.id,
                        item.name,
                        item.description,
                        item.id,
                    ]),
                total: (data) => data.total,
            },
        }).render(tableContainer);

        document.addEventListener("click", this.handleDelete.bind(this));
    }

    handleDelete(event) {
        if (event.target.classList.contains("btn-delete-role")) {
            event.preventDefault();

            const id = event.target.getAttribute("data-id");
            let modalElement = document.getElementById("modalConfirmation");
            let toastMessage = document.getElementById("toast-message");

            if (!modalElement) {
                console.error("Modal element not found!");
                return;
            }

            let modal = new bootstrap.Modal(modalElement);
            let btnSaveConfirmation = document.getElementById(
                "btnSaveConfirmation"
            );
            let toastElement = document.getElementById("toastNotification");
            let toast = new bootstrap.Toast(toastElement);

            // Remove previous event listeners to avoid multiple bindings
            btnSaveConfirmation.replaceWith(
                btnSaveConfirmation.cloneNode(true)
            );
            btnSaveConfirmation = document.getElementById(
                "btnSaveConfirmation"
            );

            // Set the role ID on the confirm button inside the modal
            btnSaveConfirmation.setAttribute("data-role-id", id);

            // Show the modal
            modal.show();

            btnSaveConfirmation.addEventListener("click", async () => {
                let roleId = btnSaveConfirmation.getAttribute("data-role-id");

                try {
                    let response = await fetch(`/roles/${roleId}`, {
                        method: "DELETE",
                        credentials: "include",
                        headers: {
                            "X-CSRF-TOKEN": document
                                .querySelector('meta[name="csrf-token"]')
                                .getAttribute("content"),
                            "Content-Type": "application/json",
                        },
                    });

                    if (response.ok) {
                        let result = await response.json();
                        toastMessage.innerText =
                            result.message || "Deleted successfully!";
                        toast.show();

                        // Hide modal
                        modal.hide();

                        // Refresh Grid.js table
                        this.refreshRolesTable();
                    } else {
                        let error = await response.json();
                        console.error("Delete failed:", error);
                        toastMessage.innerText =
                            error.message || "Delete failed!";
                        toast.show();
                    }
                } catch (error) {
                    console.error("Error deleting item:", error);
                    toastMessage.innerText = "An error occurred!";
                    toast.show();
                }
            });
        }
    }

    refreshRolesTable() {
        if (this.table) {
            this.table
                .updateConfig({
                    server: {
                        url: `${GlobalConfig.apiHost}/api/api-roles`,
                        credentials: "include",
                        headers: {
                            Authorization: `Bearer ${document
                                .querySelector('meta[name="api-token"]')
                                .getAttribute("content")}`,
                            "Content-Type": "application/json",
                        },
                        then: (data) =>
                            data.data.map((item) => [
                                item.id,
                                item.name,
                                item.description,
                                item.id,
                            ]),
                        total: (data) => data.total,
                    },
                })
                .forceRender();
        } else {
            this.initTableRoles(); // If the table is null, reinitialize
        }
    }
}

document.addEventListener("DOMContentLoaded", function (e) {
    new Roles().init();
});
