// @name        ログ解析レポート
// @description ERROR / WARN / INFO を集計し、ハイライト・ジャンプ・エクスポートを一括実行します。

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

function analyze() {
    // ─── 集計（filter = 現在のファイル内検索） ────────────────────
    phantis.setProgress(1, 4);
    var errors = phantis.filter("ERROR|FATAL",  { regex: true, caseSensitive: false });
    phantis.setProgress(2, 4);
    var warns  = phantis.filter("WARN(?:ING)?", { regex: true, caseSensitive: false });
    phantis.setProgress(3, 4);
    var infos  = phantis.filter("\\bINFO\\b",   { regex: true, caseSensitive: false });
    phantis.setProgress(4, 4);

    // ERROR 行と重複する WARN 行を除外
    var errorLines = {};
    for (var i = 0; i < errors.length; i++) errorLines[errors[i].lineNumber] = true;
    var pureWarns = warns.filter(function(r) { return !errorLines[r.lineNumber]; });

    var sep = "──────────────────────────────────";
    var report =
        "ファイル      : " + phantis.getFileName()              + "\n" +
        "文字コード    : " + phantis.getEncoding().toUpperCase() +
        "  改行: "         + phantis.getLineEnding()            + "\n" +
        "サイズ        : " + (phantis.getFileSize() / 1024).toFixed(1) + " KB\n" +
        "総行数（概算）: " + phantis.getLineCount().toLocaleString() + " 行\n" +
        sep + "\n" +
        "ERROR / FATAL  : " + errors.length.toLocaleString()    + " 件\n" +
        "WARN / WARNING : " + pureWarns.length.toLocaleString() + " 件\n" +
        "INFO           : " + infos.length.toLocaleString()     + " 件\n" +
        sep;

    if (errors.length === 0 && pureWarns.length === 0) {
        phantis.setStatusMessage("解析完了 — 問題なし");
        phantis.message("【ログ解析結果】\n\n" + report + "\n\n✓ ERROR / WARN は検出されませんでした。");
        return;
    }

    phantis.message("【ログ解析結果】\n\n" + report);

    // ─── カラーハイライト ──────────────────────────────────────────
    if (phantis.confirm("ERROR / WARN / INFO をカラーハイライトしますか？")) {
        phantis.clearHighlights();
        if (errors.length > 0)
            phantis.addHighlight("ERROR|FATAL",  "#FFFFFF", "#CC2222", true, false);
        if (pureWarns.length > 0)
            phantis.addHighlight("WARN(?:ING)?", "#000000", "#FF9900", true, false);
        if (infos.length > 0)
            phantis.addHighlight("\\bINFO\\b",   "#000000", "#88CC44", true, false);
    }

    // ─── 最初の ERROR へジャンプ ───────────────────────────────────
    if (errors.length > 0) {
        var first   = errors[0];
        var preview = first.text.trim();
        if (preview.length > 60) preview = preview.substring(0, 60) + "…";

        if (phantis.confirm(
            "最初の ERROR へジャンプしますか？\n\n" +
            "行 " + first.lineNumber + ": " + preview
        )) {
            phantis.scrollToOffset(first.offset);   // offset ベースで確実にジャンプ
            phantis.selectLine(first.lineNumber);
        }
    }

    // ─── エクスポート ─────────────────────────────────────────────
    if (errors.length > 0) {
        var fmt = phantis.selectItem(
            "ERROR/FATAL " + errors.length + " 件のエクスポート形式を選択",
            ["CSV ファイル", "テキストファイル", "フィルタパネルに表示", "スキップ"]
        );

        if (fmt === "CSV ファイル") {
            if (phantis.exportCsv(errors))
                phantis.setStatusMessage("CSV エクスポート完了");
        } else if (fmt === "テキストファイル") {
            if (phantis.exportText(errors))
                phantis.setStatusMessage("テキスト エクスポート完了");
        } else if (fmt === "フィルタパネルに表示") {
            phantis.showInFilterPanel(errors);
            phantis.setStatusMessage("フィルタパネルに " + errors.length + " 件を表示");
        } else {
            phantis.setStatusMessage(
                "解析完了 — ERROR: " + errors.length + " / WARN: " + pureWarns.length
            );
        }
    } else {
        phantis.setStatusMessage("解析完了 — WARN: " + pureWarns.length + " 件");
    }
}
