window.dashboardInterop = {
    jaLanguage: {
        "emptyTable": "テーブルにデータがありません",
        "info": " _TOTAL_ 件中 _START_ から _END_ まで表示",
        "infoEmpty": " 0 件中 0 から 0 まで表示",
        "infoFiltered": "（全 _MAX_ 件より抽出）",
        "lengthMenu": "_MENU_ 件表示",
        "loadingRecords": "読み込み中...",
        "processing": "処理中...",
        "search": "検索:",
        "zeroRecords": "一致するレコードがありません",
        "paginate": {
            "first": "先頭",
            "last": "最終",
            "next": "次",
            "previous": "前"
        },
        "aria": {
            "sortAscending": ": 列を昇順に並べ替えるにはアクティブにする",
            "sortDescending": ": 列を降順に並べ替えるにはアクティブにする"
        }
    },

    // JSファイルがロードされたかを確認するための安全なダミー関数
    ping: function () {
        return true;
    },

    // 【究極の対策】JS側でDOM描画を待機し、準備ができたら瞬時に初期化する非同期関数
    initAnalysisTableAsync: function (tableId) {
        return new Promise((resolve, reject) => {
            const id = '#' + tableId;
            let retryCount = 0;
            const maxRetries = 100; // 50ms × 100 = 最大5秒待機

            // 内部でループしてDOMを監視
            const checkAndInit = () => {
                // テーブルの枠と見出しが完全にDOM上に存在するかチェック
                if ($(id).length > 0 && $(id).find('thead th').length > 0) {
                    try {
                        const self = window.dashboardInterop;
                        $.fn.dataTable.ext.errMode = 'none';

                        // 以前のキャッシュがあれば安全に破棄
                        if ($.fn.DataTable.isDataTable(id)) {
                            $(id).DataTable().clear().destroy();
                        }
                        $(id).find('tbody').empty();

                        // 描画された瞬間に、通信ラグなしで即座に初期化
                        $(id).DataTable({
                            language: self.jaLanguage,
                            dom: "t",
                            paging: false,
                            searching: false,
                            info: false,
                            ordering: true,
                            autoWidth: false,
                            fixedHeader: false,
                            columnDefs: [
                                { className: "col-url", targets: 0 }
                            ]
                        });
                        resolve(); // C#側に成功を通知
                    } catch (error) {
                        reject(error.toString());
                    }
                } else {
                    // まだ描画されていない場合は 50ms 後に再チェック
                    retryCount++;
                    if (retryCount >= maxRetries) {
                        reject("テーブルのDOM描画がタイムアウトしました。");
                    } else {
                        setTimeout(checkAndInit, 50);
                    }
                }
            };

            // 監視スタート
            checkAndInit();
        });
    },

    _getDt: function (tableId) {
        const id = '#' + tableId;
        if ($(id).length === 0) return null;

        if ($.fn.DataTable.isDataTable(id)) {
            return $(id).DataTable();
        }
        return null;
    },

    escapeHtml: function (unsafe) {
        return (unsafe || "").toString()
            .replace(/&/g, "&amp;")
            .replace(/</g, "&lt;")
            .replace(/>/g, "&gt;")
            .replace(/"/g, "&quot;")
            .replace(/'/g, "&#039;");
    },

    _normalizeRow: function (rowData, expectedCols) {
        let safeRow = rowData.map((d, index) => {
            if (index === 0) {
                const parts = (d || "").toString().split('|');
                const href = this.escapeHtml(parts[0]);
                let display = href;
                if (parts.length > 1 && parts[1] !== "") {
                    display = this.escapeHtml(parts[1]);
                }
                return `<a href="${href}" target="_blank" class="text-decoration-none">${display}</a>`;
            }
            return this.escapeHtml(d);
        });

        if (expectedCols > 0) {
            while (safeRow.length < expectedCols) {
                safeRow.push("");
            }
            if (safeRow.length > expectedCols) {
                safeRow = safeRow.slice(0, expectedCols);
            }
        }
        return safeRow;
    },

    addAnalysisRow: function (tableId, rowData, redraw) {
        const dt = this._getDt(tableId);
        if (dt) {
            const expectedCols = dt.columns().count();
            const safeRowData = this._normalizeRow(rowData, expectedCols);

            dt.row.add(safeRowData);

            if (redraw) {
                dt.columns.adjust().draw(false);
            }
        }
    },

    addAnalysisRowsBatch: function (tableId, rowsData) {
        const dt = this._getDt(tableId);
        if (dt && rowsData && rowsData.length > 0) {
            const expectedCols = dt.columns().count();
            const safeRows = rowsData.map(rowData => this._normalizeRow(rowData, expectedCols));

            dt.rows.add(safeRows);
            dt.columns.adjust().draw(false);
        }
    },

    drawTable: function (tableId) {
        const dt = this._getDt(tableId);
        if (dt) {
            dt.columns.adjust().draw(false);
        }
    },

    clearTable: function (tableId) {
        const dt = this._getDt(tableId);
        if (dt) {
            dt.clear().draw();
        }
    },

    sortByUrl: function (tableId) {
        const dt = this._getDt(tableId);
        if (dt) {
            dt.order([0, 'asc']).draw();
        }
    }
};