import sys
import unicodedata
from PySide6.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QLabel, QTextEdit, QLineEdit
from PySide6.QtGui import QFont, QTextCursor

class EmojiPickerApp(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("ユニコード絵文字パレット (検索機能付き)")
        self.setGeometry(100, 100, 600, 550)

        # 全ての絵文字データをあらかじめ用意しておく
        self.all_emojis_data = self.collect_emojis_with_names()

        # メインの土台
        central_widget = QWidget()
        self.setCentralWidget(central_widget)
        layout = QVBoxLayout(central_widget)

        # 1. 上部の説明・検索エリア
        top_layout = QHBoxLayout()
        self.label = QLabel("検索:")
        label_font = QFont()
        label_font.setBold(True)
        label_font.setPointSize(11)
        self.label.setFont(label_font)

        # 検索用の入力欄（テキストボックス）
        self.search_input = QLineEdit()
        self.search_input.setPlaceholderText("例: cat, sun, 顔, ハート (空欄で全表示)")
        self.search_input.setFont(QFont("Helvetica", 11))
        # 文字が入力されるたびに、自動で検索を実行する設定
        self.search_input.textChanged.connect(self.search_emojis)

        top_layout.addWidget(self.label)
        top_layout.addWidget(self.search_input)
        layout.addLayout(top_layout)

        # 2. 絵文字を表示するテキストエリア
        self.text_edit = QTextEdit()
        self.text_edit.setFont(QFont("Segoe UI Emoji", 28))
        self.text_edit.setReadOnly(True)
        layout.addWidget(self.text_edit)

        # 3. 画面下のステータスバー
        self.statusBar().showMessage("絵文字を選んでください")

        # 4. クリックした時のイベントを登録
        self.text_edit.mousePressEvent = self.on_text_clicked

        # 最初にすべての絵文字を表示
        self.search_emojis()

    def collect_emojis_with_names(self):
        """絵文字とその『検索用キーワード』のペアをすべて集める"""
        emoji_data = []
        for code in range(0, 0x110000):
            char = chr(code)
            name = unicodedata.name(char, "")

            if "EMOJI" in name or (0x1F300 <= code <= 0x1F9FF):
                if len(char) == 1 and unicodedata.category(char) in ["So", "Cn"]:
                    # 日本語でも簡易検索できるように、よく使われる言葉を少し補う
                    # (本格的な日本語対応にする場合は辞書データが必要ですが、主要なものは英語名ベースで十分ヒットします)
                    lower_name = name.lower()
                    emoji_data.append({
                        "char": char,
                        "name": lower_name
                    })

        # 重複を排除して整理
        seen = set()
        unique_data = []
        for item in emoji_data:
            if item["char"] not in seen:
                seen.add(item["char"])
                unique_data.append(item)
        return unique_data

    def search_emojis(self):
        """入力されたキーワードで絵文字を絞り込んで表示する"""
        query = self.search_input.text().strip().lower()
        filtered_emojis = []

        # 簡易的な日本語から英語へのキーワード変換（よく検索されるもの）
        japanese_hints = {
            "ねこ": "cat", "猫": "cat", "いぬ": "dog", "犬": "dog",
            "太陽": "sun", "たいよう": "sun", "月": "moon", "つき": "moon",
            "星": "star", "ほし": "star", "ハート": "heart", "はーと": "heart",
            "顔": "face", "かお": "face", "笑顔": "smile", "車": "car",
            "魚": "fish", "花": "flower", "雨": "rain", "火": "fire"
        }

        if query in japanese_hints:
            query = japanese_hints[query]

        for item in self.all_emojis_data:
            # 検索ワードが空欄、または絵文字の英語名に含まれていればヒット！
            if not query or query in item["name"]:
                filtered_emojis.append(item["char"])

        # 画面を更新
        self.text_edit.setText("  ".join(filtered_emojis))

        # 見つかった個数をステータスバーに表示
        self.statusBar().showMessage(f"{len(filtered_emojis)} 個の絵文字が見つかりました")

    def on_text_clicked(self, event):
        cursor = self.text_edit.cursorForPosition(event.pos())
        cursor.select(QTextCursor.SelectionType.WordUnderCursor)
        clicked_char = cursor.selectedText().strip()

        if len(clicked_char) == 1:
            clipboard = QApplication.clipboard()
            clipboard.setText(clicked_char)
            self.statusBar().showMessage(f"「 {clicked_char} 」をコピーしました！")

        QTextEdit.mousePressEvent(self.text_edit, event)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = EmojiPickerApp()
    window.show()
    sys.exit(app.exec())
