// @name        ログレベル カラーライザー
// @description ログレベル（ERROR/WARN/INFO 等）を行単位で色分けします。
//              プリセットを選ぶだけで一括設定。カスタム設定の保存・読み込みにも対応。

// ─── プリセット定義 ──────────────────────────────────────────────
var PRESETS = {
    "標準ログ（ERROR/WARN/INFO/DEBUG）": [
        { pattern: "ERROR|FATAL",   fg: "#FFFFFF", bg: "#CC2222", regex: true,  fullLine: true  },
        { pattern: "WARN(?:ING)?",  fg: "#000000", bg: "#FF9900", regex: true,  fullLine: true  },
        { pattern: "\\bINFO\\b",    fg: "#000000", bg: "#88CC44", regex: true,  fullLine: false },
        { pattern: "\\bDEBUG\\b",   fg: "#888888", bg: "",        regex: true,  fullLine: false },
    ],
    "Apache / Nginx アクセスログ": [
        { pattern: " 5\\d\\d ",     fg: "#FFFFFF", bg: "#CC2222", regex: true,  fullLine: true  },
        { pattern: " 4\\d\\d ",     fg: "#000000", bg: "#FF9900", regex: true,  fullLine: true  },
        { pattern: " 3\\d\\d ",     fg: "#000000", bg: "#87CEEB", regex: true,  fullLine: false },
        { pattern: " 2\\d\\d ",     fg: "#000000", bg: "#88CC44", regex: true,  fullLine: false },
    ],
    "Windows イベントログ": [
        { pattern: "Critical|Error",  fg: "#FFFFFF", bg: "#CC2222", regex: true,  fullLine: true  },
        { pattern: "Warning",         fg: "#000000", bg: "#FF9900", regex: false, fullLine: true  },
        { pattern: "Information",     fg: "#000000", bg: "#88CC44", regex: false, fullLine: false },
        { pattern: "Verbose",         fg: "#888888", bg: "",        regex: false, fullLine: false },
    ],
    "Python ログ（logging モジュール）": [
        { pattern: "CRITICAL|ERROR",  fg: "#FFFFFF", bg: "#CC2222", regex: true,  fullLine: true  },
        { pattern: "WARNING",         fg: "#000000", bg: "#FF9900", regex: false, fullLine: true  },
        { pattern: "INFO",            fg: "#000000", bg: "#88CC44", regex: false, fullLine: false },
        { pattern: "DEBUG",           fg: "#888888", bg: "",        regex: false, fullLine: false },
    ],
    "SQL スロークエリログ": [
        { pattern: "Query_time:\\s*[5-9]\\.", fg: "#FFFFFF", bg: "#CC2222", regex: true, fullLine: true  },
        { pattern: "Query_time:\\s*[1-4]\\.", fg: "#000000", bg: "#FF9900", regex: true, fullLine: true  },
        { pattern: "^# Time:",               fg: "#000000", bg: "#87CEEB", regex: true, fullLine: false },
        { pattern: "^SET timestamp=",        fg: "#888888", bg: "",        regex: true, fullLine: false },
    ],
};

var presetNames = [];
for (var k in PRESETS) presetNames.push(k);
presetNames.push("── ──");
presetNames.push("カスタム設定をファイルから読み込む");
presetNames.push("現在のルールをクリア");
presetNames.push("現在のルールを確認");

// ─── プリセット選択 ───────────────────────────────────────────────
var choice = phantis.selectItem("ログカラーライザー — プリセットを選択", presetNames);

if (choice === null || choice === "── ──") {
    // キャンセルまたはセパレータ → 何もしない

} else if (choice === "現在のルールをクリア") {
    phantis.clearLogLevelRules();
    phantis.setStatusMessage("ログレベルルールをクリアしました");

} else if (choice === "現在のルールを確認") {
    showCurrentRules();

} else if (choice === "カスタム設定をファイルから読み込む") {
    loadFromFile();

} else {
    // プリセットを適用
    applyPreset(choice, PRESETS[choice]);
}

// ─── プリセット適用 ───────────────────────────────────────────────
function applyPreset(name, rules) {
    var replaceMode = phantis.confirm(
        "「" + name + "」を適用します。\n\n" +
        "OK     → 現在のルールをクリアして新しく設定\n" +
        "キャンセル → 現在のルールに追加"
    );

    if (replaceMode) phantis.clearLogLevelRules();

    for (var i = 0; i < rules.length; i++) {
        var r = rules[i];
        phantis.addLogLevelRule(r.pattern, r.fg, r.bg, r.regex, r.fullLine);
    }

    // 設定内容をサマリー表示
    var summary = "【" + name + "】を適用しました。\n\n";
    for (var j = 0; j < rules.length; j++) {
        var r2 = rules[j];
        summary +=
            "  " + (r2.fullLine ? "行全体" : "キーワード") +
            " [" + r2.fg + "/" + (r2.bg || "背景なし") + "] " +
            r2.pattern + "\n";
    }
    summary += "\nルールはメニュー「ログレベル色分け」から管理できます。";

    phantis.message(summary);

    // スクリプトフォルダに設定を保存するか確認
    var scriptDir = phantis.getScriptDir();
    if (scriptDir && phantis.confirm("この設定を JSON ファイルに保存しますか？\n（次回「ファイルから読み込む」で再利用できます）")) {
        var safeName = name.replace(/[\\\/:\*\?"<>\| ]/g, "_").substring(0, 40);
        var savePath = scriptDir.replace(/[\\\/]+$/, "") + "/" + safeName + ".colorizer.json";
        var json = JSON.stringify({ preset: name, rules: rules }, null, 2);
        phantis.writeFile(savePath, json, "utf-8");
        phantis.setStatusMessage("設定を保存しました: " + savePath);
    } else {
        phantis.setStatusMessage("カラーライザー設定完了: " + rules.length + " ルール");
    }
}

// ─── ファイルから設定を読み込む ──────────────────────────────────
function loadFromFile() {
    var scriptDir = phantis.getScriptDir();

    // スクリプトフォルダ内の *.colorizer.json を列挙
    var configFiles = [];
    if (scriptDir) {
        configFiles = phantis.listFiles(scriptDir, "*.colorizer.json");
    }

    var filePath;
    if (configFiles.length > 0) {
        var names = configFiles.map(function(f) { return f.replace(/.*[\\\/]/, ""); });
        names.push("パスを直接入力...");
        var sel = phantis.selectItem("読み込む設定ファイルを選択", names);
        if (sel === null) { phantis.setStatusMessage("キャンセル"); return; }
        if (sel === "パスを直接入力...") {
            filePath = phantis.prompt("設定ファイルのフルパスを入力:", "");
        } else {
            filePath = scriptDir.replace(/[\\\/]+$/, "") + "/" + sel;
        }
    } else {
        filePath = phantis.prompt(
            "設定ファイル（*.colorizer.json）のパスを入力してください:",
            scriptDir ? scriptDir.replace(/[\\\/]+$/, "") + "/" : ""
        );
    }

    if (!filePath || filePath.trim() === "") { phantis.setStatusMessage("キャンセル"); return; }

    var json;
    try {
        json = JSON.parse(phantis.readTextFile(filePath.trim(), "utf-8"));
    } catch(e) {
        phantis.message("ファイルの読み込みに失敗しました:\n" + e.message);
        return;
    }

    if (!json.rules || !Array.isArray(json.rules)) {
        phantis.message("有効なカラーライザー設定ファイルではありません。");
        return;
    }

    applyPreset(json.preset || "カスタム設定", json.rules);
}

// ─── 現在のルールを確認 ───────────────────────────────────────────
function showCurrentRules() {
    var rules = phantis.getLogLevelRules();
    if (rules.length === 0) {
        phantis.message("現在ログレベルルールは設定されていません。");
        return;
    }

    var msg = "現在のログレベルルール: " + rules.length + " 件\n\n";
    for (var i = 0; i < rules.length; i++) {
        var r = rules[i];
        msg +=
            "  " + (i + 1) + ". " + r.pattern + "\n" +
            "     色: " + r.fgColor + " / " + (r.bgColor || "なし") +
            "  regex: " + r.isRegex +
            "  全行: " + r.fullLine + "\n";
    }

    var action = phantis.selectItem(msg + "\n操作を選択:", ["閉じる", "すべてクリア"]);
    if (action === "すべてクリア") {
        phantis.clearLogLevelRules();
        phantis.setStatusMessage("ログレベルルールをクリアしました");
    }
}
