// @name        ファイル統計レポート
// @description 行数・空行数・最長行・文字数などの統計情報を表示します。
//              setProgress で進捗を表示しながら解析します。

if (!phantis.isFileOpen()) {
    phantis.message("ファイルが開かれていません。");
} else {
    var totalLines = phantis.getLineCount();

    var scanLines = totalLines;
    if (totalLines > 1000000) {
        if (!phantis.confirm(
            "ファイルが " + totalLines.toLocaleString() + " 行あります。\n" +
            "先頭 100,000 行のみ解析します。続けますか？"
        )) {
            phantis.setStatusMessage("キャンセルしました");
        } else {
            runStats(100000);
        }
    } else {
        runStats(totalLines);
    }
}

function runStats(scanLines) {
    var emptyLines    = 0;
    var totalChars    = 0;
    var maxLen        = 0;
    var maxLenLineNo  = 1;
    var minLen        = -1;
    var minLenLineNo  = 1;

    var progressStep = Math.max(1, Math.floor(scanLines / 100));  // 1% ごとに更新

    for (var i = 1; i <= scanLines; i++) {
        var text = phantis.getLine(i);
        var len  = text.length;

        if (len === 0) {
            emptyLines++;
        } else {
            totalChars += len;
            if (len > maxLen) {
                maxLen      = len;
                maxLenLineNo = i;
            }
            if (minLen < 0 || len < minLen) {
                minLen      = len;
                minLenLineNo = i;
            }
        }

        // 1% ごとに進捗表示
        if (i % progressStep === 0) {
            phantis.setProgress(i, scanLines);
        }
    }

    phantis.setStatusMessage("");

    var nonEmpty = scanLines - emptyLines;
    var avgLen   = nonEmpty > 0 ? Math.round(totalChars / nonEmpty) : 0;
    var sep      = "──────────────────────────────────";

    var report =
        "ファイル      : " + phantis.getFileName()                   + "\n" +
        "文字コード    : " + phantis.getEncoding().toUpperCase()     +
        "  改行: "         + phantis.getLineEnding()                 + "\n" +
        "サイズ        : " + (phantis.getFileSize() / 1024).toFixed(1) + " KB\n" +
        sep + "\n" +
        "解析行数      : " + scanLines.toLocaleString()              + " 行\n" +
        "空行数        : " + emptyLines.toLocaleString()             +
        " 行（" + (scanLines > 0 ? Math.round(emptyLines / scanLines * 100) : 0) + "%）\n" +
        "非空行数      : " + nonEmpty.toLocaleString()               + " 行\n" +
        "総文字数      : " + totalChars.toLocaleString()             + " 文字\n" +
        sep + "\n" +
        "平均行長      : " + avgLen                                  + " 文字\n" +
        "最長行        : " + maxLen + " 文字（" + maxLenLineNo + " 行目）\n" +
        "最短行（非空）: " + (minLen < 0 ? "-" : minLen + " 文字（" + minLenLineNo + " 行目）");

    if (scanLines < phantis.getLineCount()) {
        report += "\n" + sep + "\n※ 先頭 " + scanLines.toLocaleString() + " 行のみ解析";
    }

    // ─── 結果表示とアクション ─────────────────────────────────────
    var action = phantis.selectItem(
        "【ファイル統計】\n\n" + report + "\n\n次のアクションを選択してください:",
        ["最長行へジャンプ", "最短行へジャンプ", "レポートをファイルに保存", "閉じる"]
    );

    if (action === "最長行へジャンプ") {
        phantis.jumpToLine(maxLenLineNo);
        phantis.selectLine(maxLenLineNo);
        phantis.setStatusMessage("最長行: " + maxLenLineNo + " 行目 (" + maxLen + " 文字)");

    } else if (action === "最短行へジャンプ") {
        phantis.jumpToLine(minLenLineNo);
        phantis.selectLine(minLenLineNo);
        phantis.setStatusMessage("最短行: " + minLenLineNo + " 行目 (" + minLen + " 文字)");

    } else if (action === "レポートをファイルに保存") {
        // スクリプトと同じフォルダに保存（AIダイアログ実行時は SaveFileDialog）
        var scriptDir = phantis.getScriptDir();
        var savePath;
        if (scriptDir) {
            savePath = scriptDir + "\\" + phantis.getFileName() + "_stats.txt";
        } else {
            var dlgResult = phantis.prompt("保存先のフルパスを入力してください:", "C:\\stats.txt");
            if (dlgResult === null) { phantis.setStatusMessage("キャンセル"); return; }
            savePath = dlgResult;
        }
        phantis.writeFile(savePath, "【ファイル統計】\n\n" + report);
        phantis.setStatusMessage("レポートを保存しました: " + savePath);

    } else {
        phantis.setStatusMessage("統計完了");
    }
}
