import sys
import os
import json
from datetime import datetime
from PySide6.QtCore import Qt, QUrl
from PySide6.QtWidgets import (
    QApplication, QMainWindow, QSplitter, QVBoxLayout, QHBoxLayout,
    QWidget, QTextEdit, QPushButton, QLabel, QMessageBox, QTreeView, QInputDialog, QLineEdit
)
from PySide6.QtGui import QStandardItemModel, QStandardItem, QDesktopServices, QShortcut, QKeySequence, QTextCursor, QFont
from pathlib import Path

class AdvancedIdeaProcessor(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Tj_IdeaProcessor - 2026 (2画面分割)")
        self.setGeometry(100, 100, 1200, 750)

        # 📌 1. ファイルパスの設定
        base_dir = Path(__file__).resolve().parent
        data_dir = base_dir / "data"

        self.json_filename = "ideas_data.json"
        self.json_path = str(base_dir / self.json_filename)

        if data_dir.exists() and data_dir.is_dir():
            json_files = list(data_dir.glob("data_*.json"))
            if json_files:
                json_files.sort()
                latest_file = json_files[-1]
                self.json_filename = latest_file.name
                self.json_path = str(latest_file)

        # メモリ管理用変数
        self.current_idea_id = None
        self.is_modified = False
        self.runtime_data = {}

        # メインレイアウト
        main_widget = QWidget()
        self.setCentralWidget(main_widget)
        main_layout = QHBoxLayout(main_widget)

        splitter = QSplitter(Qt.Horizontal)
        main_layout.addWidget(splitter)

        # 📂 [左側] アイデア一覧エリア
        left_widget = QWidget()
        left_layout = QVBoxLayout(left_widget)
        left_layout.addWidget(QLabel("📂 アイデア一覧 (JSONノード)"))

        # 検索フィルターバー
        search_layout = QHBoxLayout()
        self.search_input = QLineEdit()
        self.search_input.setPlaceholderText("キーワードでツリーを絞り込み")
        self.search_input.textChanged.connect(self.filter_tree)

        self.clear_search_button = QPushButton("❌ 解除")
        self.clear_search_button.setFixedWidth(60)
        self.clear_search_button.clicked.connect(self.clear_filter)

        search_layout.addWidget(self.search_input)
        search_layout.addWidget(self.clear_search_button)
        left_layout.addLayout(search_layout)

        self.tree_view = QTreeView()
        self.model = QStandardItemModel()
        left_layout.addWidget(self.tree_view)

        # 右クリックメニューの有効化
        self.tree_view.setContextMenuPolicy(Qt.CustomContextMenu)
        self.tree_view.customContextMenuRequested.connect(self.show_context_menu)

        self.tree_view.clicked.connect(self.on_tree_item_clicked_with_confirm)
        splitter.addWidget(left_widget)

        # 📝 [右側] メインコンテンツエリア
        right_widget = QWidget()
        right_layout = QVBoxLayout(right_widget)

        top_bar_layout = QHBoxLayout()
        self.help_button = QPushButton("❓ 使い方ヘルプ")
        self.help_button.setFixedWidth(110)
        self.help_button.clicked.connect(self.show_help)
        top_bar_layout.addWidget(self.help_button)

        self.new_button = QPushButton("➕ 新規作成")
        self.new_button.setFixedWidth(110)
        self.new_button.setStyleSheet("font-weight: bold; background-color: #e8f5e9;")
        self.new_button.clicked.connect(lambda: self.create_new_idea(parent_id=None))
        top_bar_layout.addWidget(self.new_button)

        self.save_button = QPushButton("💾 変更を保存")
        self.save_button.setFixedWidth(110)
        self.save_button.setStyleSheet("font-weight: bold; background-color: #e1f5fe;")
        self.save_button.clicked.connect(self.save_all_to_json_file)
        top_bar_layout.addWidget(self.save_button)

        top_bar_layout.addStretch()
        right_layout.addLayout(top_bar_layout)

        # 編集エリアを上下に分割するレイアウト
        editor_splitter = QSplitter(Qt.Vertical)

        # 上段：本文入力欄 (area1)
        area1_container = QWidget()
        area1_layout = QVBoxLayout(area1_container)
        area1_layout.setContentsMargins(0, 0, 0, 0)
        area1_layout.addWidget(QLabel("📝 本文 (1行目はタイトル)"))
        self.area1_edit = QTextEdit()
        self.area1_edit.setPlaceholderText("本文...")
        area1_layout.addWidget(self.area1_edit)
        editor_splitter.addWidget(area1_container)

        # 下段：ノート入力欄 (area2)
        area2_container = QWidget()
        area2_layout = QVBoxLayout(area2_container)
        area2_layout.setContentsMargins(0, 0, 0, 0)
        area2_layout.addWidget(QLabel("📓 ノート (詳細メモ)"))
        self.area2_edit = QTextEdit()
        self.area2_edit.setPlaceholderText("ノート...")
        area2_layout.addWidget(self.area2_edit)
        editor_splitter.addWidget(area2_container)

        # 比率を調整（350, 350 でちょうど半分の均等分割になります）
        editor_splitter.setSizes([350, 350])
        right_layout.addWidget(editor_splitter)

        splitter.addWidget(right_widget)
        splitter.setSizes([350, 850])

        # ---------------------------------------------------------
        # 🎨 背景色の設定（おとなしめの落ち着いたトーン）
        # ---------------------------------------------------------
        self.setStyleSheet("QMainWindow { background-color: #8e9fa3; }") # 本体
        self.tree_view.setStyleSheet("QTreeView { background-color: #cdfae0; }")
        self.area1_edit.setStyleSheet("QTextEdit { background-color: #edfffb; }")
        self.area2_edit.setStyleSheet("QTextEdit { background-color: #faedf5; }")

        # ---------------------------------------------------------
        # ✍️ フォントの種類と大きさの設定
        # ---------------------------------------------------------
        font_base = self.font()
        font_base.setPointSize(10)
        self.setFont(font_base)
        self.tree_view.setFont(font_base)

        # 入力欄専用フォント（例: メイリオ 14pt）※お好みのフォント名に書き換え可能です
        editor_font = QFont("Consoras", 14)
        self.area1_edit.setFont(editor_font)
        self.area2_edit.setFont(editor_font)

        # ショートカット登録
        self.shortcut_link = QShortcut(QKeySequence("Ctrl+K"), self)
        self.shortcut_link.activated.connect(self.show_insert_link_dialog)

        # 初回データロード
        self.load_initial_json_to_memory()
        self.refresh_tree_view()

        self.tree_view.setFocus()
        if self.model.rowCount() > 0:
            first_index = self.model.index(0, 0)
            self.tree_view.setCurrentIndex(first_index)
            self.on_tree_item_clicked_with_confirm(first_index)
        else:
            self.show_welcome_message()


    # ---------------------------------------------------------
    # 💾 メモリ管理・JSONファイル制御ロジック
    # ---------------------------------------------------------
    def load_initial_json_to_memory(self):
        """起動時に一度だけJSONファイルを読み込み、メモリ(self.runtime_data)に展開する"""
        if not os.path.exists(self.json_path):
            initial_data = {
                "2026-07-05_10-37-40": {
                    "area1": "プロジェクトの開始",
                    "area2": "PySide6を使ってアイデアプロセッサーを作成する。",
                    "parent": None
                }
            }
            try:
                os.makedirs(os.path.dirname(self.json_path), exist_ok=True)
                with open(self.json_path, "w", encoding="utf-8") as f:
                    json.dump(initial_data, f, ensure_ascii=False, indent=4)
            except Exception as e:
                print(f"初期ファイル作成エラー: {e}")

        try:
            with open(self.json_path, "r", encoding="utf-8") as f:
                raw_data = json.load(f)
            if isinstance(raw_data, dict):
                self.runtime_data = raw_data
            else:
                self.runtime_data = {}
        except Exception as e:
            QMessageBox.critical(self, "エラー", f"JSONの読み込みに失敗しました:\n{e}")
            self.runtime_data = {}

    def get_expanded_nodes(self):
        """現在展開されているノードID一覧を取得"""
        expanded = set()

        def walk(parent):
            for r in range(parent.rowCount()):
                item = parent.child(r)
                if not item:
                    continue

                index = item.index()

                if self.tree_view.isExpanded(index):
                    expanded.add(item.data(Qt.UserRole))

                walk(item)

        walk(self.model.invisibleRootItem())
        return expanded

    def refresh_tree_view(self):
        """メモリ上のデータ(self.runtime_data)を解析し、無限階層のツリーとして正確に再描画する"""

        expanded_nodes = set()
        if self.model:
            expanded_nodes = self.get_expanded_nodes()
        new_model = QStandardItemModel()
        new_model.setHorizontalHeaderLabels(["📂 アイデア構造ツリー"])
        root_item = new_model.invisibleRootItem()

        item_dict = {}
        parent_map = {}

        # 1週目: すべての表示用ノードオブジェクトを正しく作成・辞書に登録
        for key, value in self.runtime_data.items():
            if key == "ideas" or not isinstance(value, dict) or "area1" not in value:
                continue

            area1_text = value.get("area1", "").strip()
            area2_text = value.get("area2", "").strip()

            area1_first = area1_text.splitlines()[0] if area1_text else ""
            area2_first = area2_text.splitlines()[0] if area2_text else ""

            display_title = f"📅 {key} | {area1_first}"

            if area2_first:
                display_title += f"\n📝 {area2_first}"

            node_item = QStandardItem(display_title)
            node_item.setData(key, Qt.UserRole)

            item_dict[key] = node_item  # タプルではなく、純粋なQStandardItemオブジェクトを格納
            parent_map[key] = value.get("parent")  # 親IDは別の辞書で管理

        # 2週目: parent_mapを元に、正しい親子階層でツリーに配置
        for key, node_item in item_dict.items():
            parent_id = parent_map.get(key)
            if parent_id and parent_id in item_dict:
                # 親ノードオブジェクト（QStandardItem）に対して直接 appendRow を実行するよう修正
                item_dict[parent_id].appendRow(node_item)
            else:
                root_item.appendRow(node_item)

        self.model = new_model
        self.tree_view.setModel(self.model)

        # 起動直後だけ全展開する
        if not hasattr(self, "_tree_initialized"):
            self.tree_view.expandAll()
            self._tree_initialized = True

        self.tree_view.setColumnWidth(0, 500)
        self.tree_view.viewport().update()

    def load_idea_from_json(self, idea_id):
        """ツリーで選択されたデータをメモリから読み込み、本文とノートをそれぞれの専用エディタに表示する"""
        if self.current_idea_id and self.is_modified:
            # 現在編集中のテキストをメモリ側へ一旦退避（まだファイル保存はしない）
            self.sync_editor_to_memory()

        self.current_idea_id = idea_id
        area1_text = "新規アイテム"
        area2_text = ""

        if idea_id in self.runtime_data:
            area1_text = self.runtime_data[idea_id].get("area1", "").strip()
            area2_text = self.runtime_data[idea_id].get("area2", "").strip()

        # シグナルを一時的に遮断して、それぞれの箱に別々に展開
        self.area1_edit.blockSignals(True)
        self.area2_edit.blockSignals(True)

        self.area1_edit.setPlainText(area1_text)
        self.area2_edit.setPlainText(area2_text)

        self.area1_edit.blockSignals(False)
        self.area2_edit.blockSignals(False)

        # 📌 RuntimeWarning を防ぐため、すでに接続されている場合のみ安全に解除するよう修正
        try:
            self.area1_edit.textChanged.disconnect()
        except (TypeError, RuntimeError): pass
        try:
            self.area2_edit.textChanged.disconnect()
        except (TypeError, RuntimeError): pass

        self.area1_edit.textChanged.connect(self.set_modified_true)
        self.area2_edit.textChanged.connect(self.set_modified_true)
        self.is_modified = False

    def set_modified_true(self):
        """テキストが変更されたら未保存フラグを立て、保存ボタンの色を強調する"""
        if not self.is_modified:
            self.is_modified = True
            self.save_button.setStyleSheet("font-weight: bold; background-color: #ffcc80;") # オレンジ色に警告変化

    def sync_editor_to_memory(self):
        """現在2つのエディタに書かれている内容を、メモリ上の辞書データへダイレクトに反映する(一時保存)"""
        if not self.current_idea_id:
            return

        # 📌 分割されたエディタからそのままテキストを取得（▶のチェックは不要になりました）
        area1_text = self.area1_edit.toPlainText().strip()
        area2_text = self.area2_edit.toPlainText()

        if self.current_idea_id in self.runtime_data:
            self.runtime_data[self.current_idea_id]["area1"] = area1_text
            self.runtime_data[self.current_idea_id]["area2"] = area2_text
        else:
            self.runtime_data[self.current_idea_id] = {
                "area1": area1_text,
                "area2": area2_text,
                "parent": None
            }

    def save_all_to_json_file(self):
        """【手動確定】ボタン押下時：すべての移動・追加・編集内容を一括でJSONファイルへ書き込む"""
        if self.current_idea_id:
            self.sync_editor_to_memory()

        try:
            # メモリ上の全データを一括でファイルへ上書き
            with open(self.json_path, "w", encoding="utf-8") as f:
                json.dump(self.runtime_data, f, ensure_ascii=False, indent=4)

            self.is_modified = False
            self.save_button.setStyleSheet("font-weight: bold; background-color: #e1f5fe;") # 通常の薄い青に戻す

            # ツリーの文字（タイトル）が書き換わっている可能性があるのでリフレッシュ
            self.tree_view.blockSignals(True)
            saved_id = self.current_idea_id
            self.refresh_tree_view()

            # 保存元のアイテムを再選択
            def reselect(item):
                if item.data(Qt.UserRole) == saved_id:
                    self.tree_view.setCurrentIndex(item.index())
                    return True
                for r in range(item.rowCount()):
                    if reselect(item.child(r, 0)):
                        return True
                return False

            reselect(self.model.invisibleRootItem())
            self.tree_view.blockSignals(False)

            QMessageBox.information(self, "確定保存完了", "すべての変更をJSONファイルに一括保存しました！")

        except Exception as e:
            QMessageBox.critical(self, "保存エラー", f"ファイルへの書き込みに失敗しました:\n{e}")

    # ---------------------------------------------------------
    # ➕ 新規作成・右クリック拡張ロジック
    # ---------------------------------------------------------
    def create_new_idea(self, parent_id=None):
        """現在の日時をキーとした新しいアイデアノードをメモリ上に作成する（親子階層対応）"""
        if self.current_idea_id:
            self.sync_editor_to_memory()

        # 現在のタイムスタンプ文字列を生成 (例: 2026-07-06_15-16-00)
        new_id = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")

        if new_id in self.runtime_data:
            return

        # メモリ上に仮作成（まだファイルには書き込まない）
        self.runtime_data[new_id] = {
            "area1": "新規アイテム",
            "area2": "",
            "parent": parent_id  # 親ノードのID（無ければNone）
        }

        self.set_modified_true() # 変更フラグを立てて保存を促す
        self.refresh_tree_view()

        # ツリーから新しく作ったノードを探してフォーカスを当てる
        def find_and_focus(item):
            if item.data(Qt.UserRole) == new_id:
                self.tree_view.setCurrentIndex(item.index())
                self.load_idea_from_json(new_id)
                return True
            for r in range(item.rowCount()):
                if find_and_focus(item.child(r, 0)):
                    return True
                return False

        find_and_focus(self.model.invisibleRootItem())

        # 📌 本文入力欄にフォーカスを合わせ、文字を全選択してすぐ上書きできるようにする
        self.area1_edit.setFocus()
        cursor = self.area1_edit.textCursor()
        cursor.movePosition(QTextCursor.MoveOperation.Start)
        cursor.movePosition(QTextCursor.MoveOperation.EndOfLine, QTextCursor.MoveMode.KeepAnchor)
        self.area1_edit.setTextCursor(cursor)

    def show_context_menu(self, position):
        """右クリックメニューを表示する（上下左右移動・モデル対応版展開/折り畳み・下位ノード追加・削除）"""
        # 📌 見た目の位置(index)を取得
        view_index = self.tree_view.indexAt(position)
        if not view_index.isValid():
            return

        item = self.model.itemFromIndex(view_index)
        if not item:
            return

        idea_id = item.data(Qt.UserRole)
        if not idea_id:
            return

        from PySide6.QtWidgets import QMenu
        menu = QMenu()

        # 1. 移動メニュー
        move_up_action = menu.addAction("⬆️ このノードを上に移動")
        move_down_action = menu.addAction("⬇️ このノードを下に移動")
        move_left_action = menu.addAction("⬅️ このノードを格上げ (左へ)")
        move_right_action = menu.addAction("➡️ このノードを格下げ (右へ)")
        menu.addSeparator()

        # 2. 展開・折り畳みメニュー
        expand_item_action = menu.addAction("📂 このノードを展開する")
        collapse_item_action = menu.addAction("📁 このノードを折りたたむ")
        expand_all_action = menu.addAction("📖 すべてを展開する")
        collapse_all_action = menu.addAction("📕 すべてを折りたたむ")
        menu.addSeparator()

        # 3. 追加・削除メニュー
        add_child_action = menu.addAction("🌿 下位ノード(子)を追加")
        menu.addSeparator()
        delete_action = menu.addAction("🗑️ このアイデアを完全に削除")

        action = menu.exec(self.tree_view.viewport().mapToGlobal(position))

        # 移動アクションの処理
        if action == move_up_action:
            self.move_idea_order(idea_id, direction="up")
        elif action == move_down_action:
            self.move_idea_order(idea_id, direction="down")
        elif action == move_left_action:
            self.move_idea_order(idea_id, direction="left")
        elif action == move_right_action:
            self.move_idea_order(idea_id, direction="right")

        # 📌 【展開・折り畳みの修正】
        # 個別開閉は、見た目のインデックス(view_index)をそのまま使うことで正確に動作させます
        elif action == expand_item_action:
            self.tree_view.setExpanded(view_index, True)

        elif action == collapse_item_action:
            self.tree_view.setExpanded(view_index, False)

        elif action == expand_all_action:
            self.tree_view.expandAll()

        elif action == collapse_all_action:
            self.tree_view.collapseAll()

        # 追加・削除の処理
        elif action == add_child_action:
            self.create_new_idea(parent_id=idea_id)
        elif action == delete_action:
            self.delete_idea(idea_id)

    def filter_tree(self):
        """【検索機能修正】キーワードに基づいて、本文(area1)とノート(area2)の両方を検索して絞り込む"""
        query = self.search_input.text().strip().lower()

        # 検索文字が空なら、すべてのノードを再表示
        if not query:
            for row in range(self.model.rowCount()):
                self.tree_view.setRowHidden(row, self.tree_view.rootIndex(), False)
            return

        # メモリ上の全データ(self.runtime_data)を直接スキャンしてヒットするIDを割り出す
        hit_ids = set()
        for key, value in self.runtime_data.items():
            if key == "ideas" or not isinstance(value, dict):
                continue

            # 日付キー、本文(area1)、ノート(area2)のすべてを検索対象にする
            date_text = key.lower()
            area1_text = value.get("area1", "").lower()
            area2_text = value.get("area2", "").lower()

            if (query in date_text) or (query in area1_text) or (query in area2_text):
                hit_ids.add(key)

                # 📌 親ノードや先祖ノードも連動して表示させるため、親IDを辿って追加
                pid = value.get("parent")
                while pid:
                    hit_ids.add(pid)
                    pid = self.runtime_data.get(pid, {}).get("parent")

        # ツリー上の最上位（ルート）ノードを1つずつチェックし、ヒットしなかった行を非表示にする
        for row in range(self.model.rowCount()):
            parent_item = self.model.item(row, 0)
            if not parent_item:
                continue

            idea_id = parent_item.data(Qt.UserRole)
            if idea_id in hit_ids:
                self.tree_view.setRowHidden(row, self.tree_view.rootIndex(), False)
                # 子ノード（下位階層）も再帰的にチェックして表示制御する
                self._filter_child_nodes(parent_item, hit_ids)
            else:
                self.tree_view.setRowHidden(row, self.tree_view.rootIndex(), True)

    def _filter_child_nodes(self, parent_item, hit_ids):
        for row in range(parent_item.rowCount()):
            child_item = parent_item.child(row, 0)
            if not child_item:
                continue

            child_id = child_item.data(Qt.UserRole)

            if child_id in hit_ids:
                self.tree_view.setRowHidden(
                    row,
                    child_item.index().parent(),
                    False
                )
            else:
                self.tree_view.setRowHidden(
                    row,
                    child_item.index().parent(),
                    True
                )

            self._filter_child_nodes(child_item, hit_ids)

    def _filter_child_nodes(self, parent_item, hit_ids):
        """子ノードの階層を深さに関係なく正しく絞り込むための補助関数"""
        for row in range(parent_item.rowCount()):
            child_item = parent_item.child(row, 0)
            if not child_item:
                continue

            child_id = child_item.data(Qt.UserRole)
            if child_id in hit_ids:
                self.tree_view.setRowHidden(row, parent_item.index(), False)
                self._filter_child_nodes(child_item, hit_ids)
            else:
                self.tree_view.setRowHidden(row, parent_item.index(), True)
                self._filter_child_nodes(child_item, hit_ids)

    def move_idea_order(self, idea_id, direction="up"):
        """メモリ上のデータの並び順や親子関係(左右)を入れ替え、ツリーを即時リフレッシュする"""
        if idea_id not in self.runtime_data:
            return

        keys = list(self.runtime_data.keys())
        idx = keys.index(idea_id)
        current_parent = self.runtime_data[idea_id].get("parent")

        # --- ⬆️ 上に移動 / ⬇️ 下に移動 ---
        if direction in ("up", "down"):
            if direction == "up" and idx > 0:
                keys[idx], keys[idx-1] = keys[idx-1], keys[idx]
            elif direction == "down" and idx < len(keys) - 1:
                keys[idx], keys[idx+1] = keys[idx+1], keys[idx]
            else:
                return
            self.runtime_data = {k: self.runtime_data[k] for k in keys}

        # --- ⬅️ 格上げ（左へ移動：子から親へ） ---
        elif direction == "left":
            if current_parent is None:
                return
            grandparent = self.runtime_data.get(current_parent, {}).get("parent")
            self.runtime_data[idea_id]["parent"] = grandparent

        # --- ➡️ 格下げ（右へ移動：同階層の1つ上の子になる） ---
        elif direction == "right":
            target_parent = None
            for k in keys:
                if k == idea_id:
                    break
                if self.runtime_data[k].get("parent") == current_parent:
                    target_parent = k

            if target_parent is None:
                return
            self.runtime_data[idea_id]["parent"] = target_parent

        self.set_modified_true()
        self.refresh_tree_view()

        def reselect(item):
            if item.data(Qt.UserRole) == idea_id:
                self.tree_view.setCurrentIndex(item.index())
                return True
            for r in range(item.rowCount()):
                if reselect(item.child(r, 0)):
                    return True
                return False

        reselect(self.model.invisibleRootItem())

    def delete_idea(self, idea_id):
        """指定されたデータをメモリから削除する"""
        reply = QMessageBox.question(
            self, "削除の確認",
            f"日付ID: {idea_id}\n\nこのアイデアデータを本当に削除しますか？\n（変更を保存するまではファイルに反映されません）",
            QMessageBox.Yes | QMessageBox.No, QMessageBox.No
        )
        if reply == QMessageBox.No:
            return

        if idea_id in self.runtime_data:
            del self.runtime_data[idea_id]
            for k, v in self.runtime_data.items():
                if v.get("parent") == idea_id:
                    v["parent"] = None

        if self.current_idea_id == idea_id:
            self.current_idea_id = None
            self.area1_edit.blockSignals(True)
            self.area2_edit.blockSignals(True)
            self.area1_edit.clear()
            self.area2_edit.clear()
            self.area1_edit.blockSignals(False)
            self.area2_edit.blockSignals(False)

        self.set_modified_true()
        self.refresh_tree_view()

        if self.model.rowCount() > 0:
            first_index = self.model.index(0, 0)
            self.tree_view.setCurrentIndex(first_index)
            self.load_idea_from_json(self.model.item(0, 0).data(Qt.UserRole))
        else:
            self.show_welcome_message()

    def clear_filter(self):
        self.search_input.clear()
        self.search_input.setFocus()

    def on_tree_item_clicked_with_confirm(self, index):
        """ツリークリック時の安全な移動ロジック"""
        item = self.model.itemFromIndex(index)
        if not item:
            return

        idea_id = item.data(Qt.UserRole)
        if not idea_id:
            return

        if idea_id == self.current_idea_id:
            return

        self.load_idea_from_json(idea_id)

    def show_insert_link_dialog(self):
        # ショートカット（Ctrl+K）はノート側で発火
        cursor = self.area2_edit.textCursor()
        selected_text = cursor.selectedText()

        if not selected_text:
            QMessageBox.warning(self, "リンク挿入", "ノート側の文字を選択して Ctrl+K を押してください。")
            return

        target_id, ok = QInputDialog.getText(
            self, "内部リンク", f"「{selected_text}」のジャンプ先の日付ID:"
        )

        if ok and target_id.strip():
            cursor.insertText(f"[{selected_text}]({target_id.strip()})")

    def show_welcome_message(self):
        self.area1_edit.setPlainText("🚀 TjIdeaProcessor")
        self.area2_edit.setPlainText("左側のツリーからノードを選択するか、新規作成してください。")

    def show_help(self):
        QMessageBox.information(
            self, "ヘルプ",
            "1. 上段の【本文】に入力した内容が、左側ツリーのタイトルに直結します。\n"
            "2. 下段の【ノート】には制限なく詳細なメモを書き込めます。境界線（▶）を気にする必要はありません。\n"
            "3. 右クリックメニューからノードの上下移動や階層移動（⬅️格上げ・➡️格下げ）がその場で行えます。\n"
            "4. すべての変更は、右上の「💾 変更を保存」ボタンを押すことでJSONファイルに一括確定保存されます。"
        )

if __name__ == "__main__":
    app = QApplication(sys.argv)

    font = app.font()
    font.setPointSize(10)
    app.setFont(font)

    window = AdvancedIdeaProcessor()
    window.show()
    sys.exit(app.exec())
