// @name        フィルタ ＆ エクスポート
// @description キーワードで絞り込んだ行をファイルに書き出します。AND 絞り込みにも対応。

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

function run() {
    // ─── 1次検索 ──────────────────────────────────────────────────
    var keyword1 = phantis.prompt(
        "検索キーワードを入力してください。\n（正規表現も使えます）",
        phantis.getSearchPattern()
    );

    if (keyword1 === null || keyword1.trim() === "") {
        phantis.setStatusMessage("キャンセルしました");
        return;
    }

    var useRegex = phantis.confirm("正規表現として扱いますか？");

    phantis.setStatusMessage("フィルタ中: " + keyword1);
    var results = phantis.filter(keyword1, { regex: useRegex, caseSensitive: false });

    if (results.length === 0) {
        phantis.message("「" + keyword1 + "」は見つかりませんでした。");
        phantis.setStatusMessage("0 件");
        return;
    }

    // ─── 2次絞り込み（任意）─────────────────────────────────────
    var keyword2 = phantis.prompt(
        "1次検索: 「" + keyword1 + "」→ " + results.length + " 件\n\n" +
        "さらに AND 絞り込みするキーワードを入力してください。\n" +
        "（スキップする場合はそのまま OK）",
        ""
    );

    if (keyword2 === null) {
        phantis.setStatusMessage("キャンセルしました");
        return;
    }

    if (keyword2.trim() !== "") {
        var re2 = null;
        try { re2 = new RegExp(keyword2, "i"); } catch(e) {}
        var filtered = results.filter(function(r) {
            if (re2) { try { return re2.test(r.text); } catch(e) {} }
            return r.text.toLowerCase().indexOf(keyword2.toLowerCase()) >= 0;
        });

        if (filtered.length === 0) {
            phantis.message(
                "「" + keyword1 + "」AND「" + keyword2 + "」\n\n" +
                "絞り込み結果が 0 件でした。条件を変えてお試しください。"
            );
            phantis.setStatusMessage("絞り込み: 0 件");
            return;
        }
        results = filtered;
    }

    // ─── プレビュー表示 ───────────────────────────────────────────
    var preview = "";
    var previewCount = Math.min(5, results.length);
    for (var i = 0; i < previewCount; i++) {
        var t = results[i].text.trim();
        if (t.length > 52) t = t.substring(0, 52) + "…";
        preview += "  " + results[i].lineNumber + ": " + t + "\n";
    }
    if (results.length > 5) preview += "  … 他 " + (results.length - 5) + " 件\n";

    // ─── 出力先の選択 ─────────────────────────────────────────────
    var fmt = phantis.selectItem(
        "検索結果 " + results.length + " 件 — 出力先を選択\n\n" + preview,
        ["フィルタパネルに表示", "CSV ファイル", "テキストファイル", "キャンセル"]
    );

    if (fmt === null || fmt === "キャンセル") {
        phantis.setStatusMessage("キャンセルしました");
        return;
    }

    // ハイライト（共通）
    phantis.clearHighlights();
    phantis.addHighlight(keyword1, "#000000", "#FFD700", useRegex, false);
    if (keyword2 && keyword2.trim() !== "") {
        phantis.addHighlight(keyword2, "#000000", "#87CEEB", false, false);
    }
    // 最初のヒットへ offset でジャンプ
    phantis.scrollToOffset(results[0].offset);

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