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.js";

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

    getFetchApiData() {
        let tableContainer = document.getElementById("table-data-settings");

        if (this.table) {
            // If table exists, update its data instead of recreating
            this.table
                .updateConfig({
                    server: {
                        url: `${GlobalConfig.apiHost}/api/api-data-settings`,
                        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.key,
                                item.value,
                                item.created_at,
                                item.id,
                            ]),
                        total: (data) => data.meta.total,
                    },
                })
                .forceRender();
            return;
        }

        this.table = new Grid({
            columns: [
                "ID",
                "Key",
                "Value",
                "Created",
                {
                    name: "Actions",
                    width: "120px",
                    formatter: function (cell) {
                        console.log("cell data", cell);
                        return gridjs.html(`
												<div class="d-flex justify-items-end gap-10">
												<a href="/data-settings/${cell}/edit" class="btn btn-yellow me-2">Update</a>
												<button class="btn btn-red btn-delete btn-delete-data-settings" data-id="${cell}">Delete</button>
												</div>
											`);
                    },
                },
            ],
            search: {
                server: {
                    url: (prev, keyword) => `${prev}?search=${keyword}`,
                },
            },
            pagination: {
                limit: 15,
                server: {
                    url: (prev, page) =>
                        `${prev}${prev.includes("?") ? "&" : "?"}page=${
                            page + 1
                        }`,
                },
            },
            sort: true,
            server: {
                url: `${GlobalConfig.apiHost}/api/api-data-settings`,
                headers: {
                    Authorization: `Bearer ${document
                        .querySelector('meta[name="api-token"]')
                        .getAttribute("content")}`,
                    "Content-Type": "application/json",
                },
                then: (data) =>
                    data.data.map((item) => [
                        item.id,
                        item.key,
                        item.value,
                        item.created_at,
                        item.id,
                    ]),
                total: (data) => data.meta.total,
            },
        }).render(tableContainer);

        document.addEventListener("click", this.handleDelete.bind(this));
    }
    handleDelete(event) {
        if (event.target.classList.contains("btn-delete-data-settings")) {
            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-settings-id", id);

            // Show the modal
            modal.show();

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

                try {
                    let response = await fetch(
                        `/data-settings/${dataSettingId}`,
                        {
                            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.refreshDataSettings();
                    } 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();
                }
            });
        }
    }

    refreshDataSettings() {
        if (this.table) {
            this.table
                .updateConfig({
                    server: {
                        url: `${GlobalConfig.apiHost}/api/api-data-settings`,
                        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.key,
                                item.value,
                                item.created_at,
                                item.id,
                            ]),
                        total: (data) => data.meta.total,
                    },
                })
                .forceRender();
        }
    }
}
document.addEventListener("DOMContentLoaded", function (e) {
    new DataSettings().init();
});
