// @name        Phantis API チュートリアル
// @description スクリプト API の主要機能をステップ形式で体験します。はじめての方はここから。

// チュートリアルは Step 1〜7 の順に進みます。
// confirm / selectItem でキャンセルを選ぶとその Step をスキップします。

if (!phantis.isFileOpen()) {
    phantis.message(
        "チュートリアルを開始するには\n" +
        "テキストファイルやログファイルを開いてから\n" +
        "もう一度このスクリプトを実行してください。"
    );
} else {
    runTutorial();
}

function runTutorial() {

    // ─── Step 1: ファイル情報 ─────────────────────────────────────
    phantis.message(
        "【Step 1 / 7】 ファイル情報の取得\n\n" +
        "ファイル名    : " + phantis.getFileName() + "\n" +
        "文字コード    : " + phantis.getEncoding().toUpperCase() + "\n" +
        "改行コード    : " + phantis.getLineEnding() + "\n" +
        "ファイルサイズ: " + (phantis.getFileSize() / 1024).toFixed(1) + " KB\n" +
        "総行数（概算）: " + phantis.getLineCount().toLocaleString() + " 行\n\n" +
        "使用 API:\n" +
        "  isFileOpen, getFileName, getEncoding,\n" +
        "  getLineEnding, getFileSize, getLineCount"
    );

    // ─── Step 2: ナビゲーションとオフセット ──────────────────────
    var total  = phantis.getLineCount();
    var midLine = Math.max(1, Math.floor(total / 2));
    var offset  = phantis.lineToOffset(midLine);

    phantis.firstLine();
    sleep(150);
    phantis.scrollToOffset(offset);   // 行インデックス不要の正確ジャンプ
    phantis.selectLine(midLine);

    var range = phantis.getVisibleLineRange();

    phantis.message(
        "【Step 2 / 7】 ナビゲーションとオフセット\n\n" +
        "firstLine() で先頭へ戻り、\n" +
        "中央の " + midLine + " 行目（offset: " + offset.toLocaleString() + " bytes）へジャンプしました。\n\n" +
        "現在の表示範囲: " + range.firstLine + " 〜 " + range.lastLine + " 行\n\n" +
        "scrollToOffset(offset) はバイトオフセットで直接移動するため\n" +
        "大ファイルでも行インデックスなしに確実にジャンプできます。\n\n" +
        "使用 API:\n" +
        "  firstLine, scrollToOffset, lineToOffset,\n" +
        "  selectLine, getVisibleLineRange"
    );

    // ─── Step 3: カーソルとテキスト取得 ──────────────────────────
    var curLine   = phantis.getCursorLine();
    var curOffset = phantis.getCursorOffset();
    var lineText  = phantis.getLine(curLine);
    if (lineText.length > 55) lineText = lineText.substring(0, 55) + "…";

    phantis.message(
        "【Step 3 / 7】 カーソルとテキスト取得\n\n" +
        "現在のカーソル行  : " + curLine + " 行目\n" +
        "行先頭オフセット  : " + curOffset.toLocaleString() + " bytes\n" +
        "行テキスト        : " + (lineText.trim() || "（空行）") + "\n\n" +
        "getSelectionOffsets() で選択範囲の両端オフセットも取得できます。\n\n" +
        "使用 API:\n" +
        "  getCursorLine, getCursorOffset, getLine,\n" +
        "  getLines, getCurrentLine, getSelectionOffsets"
    );

    // ─── Step 4: フィルタ検索 ─────────────────────────────────────
    var keyword = phantis.prompt(
        "【Step 4 / 7】 フィルタ検索 (filter)\n\n" +
        "現在のファイル内を検索するキーワードを入力してください:\n" +
        "（スキップする場合はそのまま OK）",
        "error"
    );

    if (keyword !== null && keyword.trim() !== "") {
        phantis.setStatusMessage("フィルタ中...");
        var hits = phantis.filter(keyword, { caseSensitive: false });

        if (hits.length === 0) {
            phantis.message(
                "【Step 4 / 7】 フィルタ検索結果\n\n" +
                "「" + keyword + "」は見つかりませんでした。\n" +
                "Step 5 へ進みます。"
            );
        } else {
            var preview = "";
            var limit   = Math.min(4, hits.length);
            for (var i = 0; i < limit; i++) {
                var t = hits[i].text.trim();
                if (t.length > 48) t = t.substring(0, 48) + "…";
                preview += "  " + hits[i].lineNumber + ": " + t + "\n";
            }
            if (hits.length > 4) preview += "  … 他 " + (hits.length - 4) + " 件\n";

            phantis.message(
                "【Step 4 / 7】 フィルタ検索結果\n\n" +
                "「" + keyword + "」: " + hits.length + " 件ヒット\n\n" +
                preview + "\n" +
                "filter() は { lineNumber, offset, text }[] を返します。\n" +
                "offset を scrollToOffset() に渡すと正確にジャンプできます。\n\n" +
                "使用 API: filter, showInFilterPanel, runFilter"
            );

            // offset ベースで最初のヒットへジャンプ
            phantis.scrollToOffset(hits[0].offset);
            phantis.showInFilterPanel(hits);
            phantis.setStatusMessage("フィルタ: " + hits.length + " 件");
        }
    }

    // ─── Step 5: selectItem と setProgress ───────────────────────
    var colorChoice = phantis.selectItem(
        "【Step 5 / 7】 ハイライトの色を選んでください",
        ["黄 (標準)", "水色 (INFO系)", "赤 (ERROR系)", "緑 (SUCCESS系)", "スキップ"]
    );

    if (colorChoice !== null && colorChoice !== "スキップ") {
        var palette = {
            "黄 (標準)":      { fg: "#000000", bg: "#FFD700" },
            "水色 (INFO系)":  { fg: "#000000", bg: "#87CEEB" },
            "赤 (ERROR系)":   { fg: "#FFFFFF", bg: "#CC2222" },
            "緑 (SUCCESS系)": { fg: "#000000", bg: "#44AA44" },
        };
        var col = palette[colorChoice] || palette["黄 (標準)"];

        phantis.clearHighlights();
        if (keyword && keyword.trim() !== "") {
            phantis.addHighlight(keyword, col.fg, col.bg, false, false);
        }

        // setProgress のデモ（ダミー処理）
        for (var p = 1; p <= 5; p++) {
            phantis.setProgress(p, 5);
            sleep(60);
        }
        phantis.setStatusMessage("ハイライト設定済み");

        phantis.message(
            "【Step 5 / 7】 selectItem と setProgress\n\n" +
            "「" + colorChoice + "」を選択してハイライトを適用しました。\n\n" +
            "selectItem(title, items[]) はドロップダウンリストを表示します。\n" +
            "setProgress(value, max) はステータスバーに進捗 (value/max %) を表示します。\n" +
            "処理完了後は setStatusMessage(\"\") でクリアします。\n\n" +
            "使用 API:\n" +
            "  selectItem, setProgress, setStatusMessage,\n" +
            "  clearHighlights, addHighlight"
        );
    }

    // ─── Step 6: findNext / findPrev ─────────────────────────────
    if (keyword && keyword.trim() !== "") {
        phantis.firstLine();
        var found = phantis.findNext(keyword, { caseSensitive: false });

        if (found) {
            phantis.scrollToOffset(found.offset);
            var foundText = found.text.trim();
            if (foundText.length > 50) foundText = foundText.substring(0, 50) + "…";

            phantis.message(
                "【Step 6 / 7】 findNext / findPrev\n\n" +
                "「" + keyword + "」の最初のヒット:\n" +
                "  行 " + found.line + " / offset " + found.offset.toLocaleString() + " bytes\n" +
                "  " + foundText + "\n\n" +
                "findNext(pattern, opts) / findPrev(pattern, opts) は\n" +
                "キャレット位置から前進・後退方向に検索します。\n" +
                "見つからない場合は null を返します（要チェック）。\n" +
                "opts: { regex: bool, caseSensitive: bool }\n\n" +
                "使用 API: findNext, findPrev"
            );
        }
    }

    // ─── Step 7: ブックマーク ─────────────────────────────────────
    var cur = phantis.getCursorLine();
    phantis.addBookmark(cur, "チュートリアルで設定");
    var bks = phantis.getBookmarks();

    phantis.message(
        "【Step 7 / 7】 ブックマーク\n\n" +
        "現在行 (" + cur + " 行目) にブックマークを追加しました。\n" +
        "現在のブックマーク数: " + bks.length + " 件\n\n" +
        "使用 API: addBookmark, getBookmarks, clearBookmarks\n\n" +
        "───────────────────────────────\n" +
        "チュートリアル完了！ 体験した主な API:\n\n" +
        "  ファイル情報  : getFileName, getEncoding, getFileSize, getLineCount\n" +
        "  ナビゲーション: firstLine, scrollToOffset, jumpToLine, lineToOffset\n" +
        "  カーソル      : getCursorLine, getCursorOffset, getVisibleLineRange\n" +
        "  テキスト      : getLine, filter, showInFilterPanel\n" +
        "  UI            : selectItem, setProgress, setStatusMessage, prompt\n" +
        "  検索          : findNext, findPrev\n" +
        "  ハイライト    : addHighlight, clearHighlights\n" +
        "  ブックマーク  : addBookmark, getBookmarks\n\n" +
        "他のサンプルスクリプトもぜひ試してみてください。"
    );

    phantis.setStatusMessage("チュートリアル完了！");
}
